Ho scritto molto del codice per i parametri del database e le quotazioni in Zend Framework mentre ero il capo del team per il progetto (fino alla versione 1.0).
Ho cercato di incoraggiare le migliori pratiche ove possibile, ma ho dovuto trovare un equilibrio con la facilità d'uso.
Nota che puoi sempre esaminare il valore della stringa di un Zend_Db_Select
oggetto, per vedere come ha deciso di fare la citazione.
print $select; // invokes __toString() method
Inoltre puoi usare Zend_Db_Profiler
per ispezionare l'SQL eseguito per tuo conto da Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Ecco alcune risposte alle tue domande specifiche:
-
Zend_Db_Select::where('last_name=?', $lname)
I valori sono citati in modo appropriato. Sebbene il "
?
" sembra un segnaposto di parametro, in questo metodo l'argomento è effettivamente citato e interpolato in modo appropriato. Quindi non è un vero parametro di query. In effetti, le due istruzioni seguenti producono esattamente la stessa query dell'utilizzo precedente:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Tuttavia, se si passa un parametro che è un oggetto di tipo
Zend_Db_Expr
, quindi non è citato. Sei responsabile dei rischi di SQL injection, perché è interpolato testualmente, per supportare i valori delle espressioni:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Qualsiasi altra parte di tale espressione che deve essere citata o delimitata è sotto la tua responsabilità. Ad esempio, se interpoli qualsiasi variabile PHP nell'espressione, la sicurezza è tua responsabilità. Se hai nomi di colonna che sono parole chiave SQL, devi delimitarli tu stesso con
quoteIdentifier()
. Esempio:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
I nomi delle tabelle e delle colonne sono delimitati, a meno che non disattivi
AUTO_QUOTE_IDENTIFIERS
.I valori sono parametrizzati come parametri di query reali (non interpolati). A meno che il valore non sia un
Zend_Db_Expr
oggetto, nel qual caso è interpolato testualmente, quindi puoi inserire espressioni oNULL
o altro. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
I nomi delle tabelle e delle colonne sono delimitati, a meno che non disattivi
AUTO_QUOTE_IDENTIFIERS
.I valori sono parametrizzati, a meno che non siano
Zend_Db_Expr
oggetti, come ininsert()
metodo.Il
$where
argomento non è affatto filtrato, quindi sei responsabile di eventuali rischi di SQL injection in quello. Puoi utilizzarequoteInto()
metodo per rendere più conveniente la quotazione.