Napisałem dużo kodu do parametrów bazy danych i cytowania w Zend Framework, gdy byłem kierownikiem zespołu nad projektem (do wersji 1.0).
Tam, gdzie to możliwe, starałem się zachęcać do najlepszych praktyk, ale musiałem zachować równowagę z łatwością użytkowania.
Pamiętaj, że zawsze możesz sprawdzić wartość ciągu Zend_Db_Select
obiekt, aby zobaczyć, jak zdecydowała się na cytowanie.
print $select; // invokes __toString() method
Możesz także użyć Zend_Db_Profiler
aby sprawdzić SQL, który jest uruchamiany w Twoim imieniu przez Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Oto kilka odpowiedzi na Twoje konkretne pytania:
-
Zend_Db_Select::where('last_name=?', $lname)
Wartości podane są odpowiednio. Chociaż „
?
" wygląda jak symbol zastępczy parametru, w tej metodzie argument jest właściwie cytowany i interpolowany. Więc nie jest to prawdziwy parametr zapytania. W rzeczywistości następujące dwie instrukcje tworzą dokładnie to samo zapytanie, co powyższe użycie:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Jeśli jednak podasz parametr, który jest obiektem typu
Zend_Db_Expr
, to nie jest cytowane. Odpowiadasz za ryzyko związane z wstrzyknięciem SQL, ponieważ jest ono interpolowane dosłownie w celu obsługi wartości wyrażeń:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Każda inna część tego wyrażenia, którą należy zacytować lub odgraniczyć, jest Twoją odpowiedzialnością. Np. jeśli interpolujesz jakieś zmienne PHP do wyrażenia, bezpieczeństwo jest Twoim obowiązkiem. Jeśli masz nazwy kolumn, które są słowami kluczowymi SQL, musisz je rozgraniczyć za pomocą
quoteIdentifier()
. Przykład:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Nazwa tabeli i nazwy kolumn są rozdzielone, chyba że wyłączysz
AUTO_QUOTE_IDENTIFIERS
.Wartości są sparametryzowane jako prawdziwe parametry zapytania (nie interpolowane). Chyba że wartością jest
Zend_Db_Expr
obiekt, w którym to przypadku jest interpolowany dosłownie, więc możesz wstawić wyrażenia lubNULL
czy cokolwiek. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Nazwa tabeli i nazwy kolumn są rozdzielone, chyba że wyłączysz
AUTO_QUOTE_IDENTIFIERS
.Wartości są sparametryzowane, chyba że są to
Zend_Db_Expr
obiekty, jak winsert()
metoda.$where
Argument nie jest w ogóle filtrowany, więc odpowiadasz za wszelkie ryzyko związane z wstrzyknięciem SQL. Możesz skorzystać zquoteInto()
metoda, dzięki której wycena jest wygodniejsza.