Ik heb veel van de code voor databaseparameters en citaten in Zend Framework geschreven terwijl ik de teamleider van het project was (tot versie 1.0).
Ik probeerde waar mogelijk best practices aan te moedigen, maar ik moest een balans vinden tussen gebruiksgemak.
Merk op dat je altijd de stringwaarde van een Zend_Db_Select
. kunt bekijken bezwaar, om te zien hoe het heeft besloten om te citeren.
print $select; // invokes __toString() method
U kunt ook de Zend_Db_Profiler
. gebruiken om de SQL te inspecteren die namens u wordt uitgevoerd door Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Hier zijn enkele antwoorden op uw specifieke vragen:
-
Zend_Db_Select::where('last_name=?', $lname)
Waarden worden op de juiste manier geciteerd. Hoewel de "
?
" lijkt op een tijdelijke aanduiding voor een parameter, in deze methode wordt het argument op de juiste manier geciteerd en geïnterpoleerd. Het is dus geen echte queryparameter. In feite produceren de volgende twee instructies precies dezelfde query als het bovenstaande gebruik:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Als u echter een parameter doorgeeft die een object is van het type
Zend_Db_Expr
, dan wordt het niet geciteerd. U bent verantwoordelijk voor SQL-injectierisico's, omdat het woordelijk wordt geïnterpoleerd om expressiewaarden te ondersteunen:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Elk ander deel van die uitdrukking dat moet worden geciteerd of afgebakend, is uw verantwoordelijkheid. Als u bijvoorbeeld PHP-variabelen in de uitdrukking interpoleert, is veiligheid uw verantwoordelijkheid. Als u kolomnamen heeft die SQL-sleutelwoorden zijn, moet u deze zelf afbakenen met
quoteIdentifier()
. Voorbeeld:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Tabelnaam en kolomnamen zijn gescheiden, tenzij u
AUTO_QUOTE_IDENTIFIERS
uitschakelt .Waarden worden geparametriseerd als echte queryparameters (niet geïnterpoleerd). Tenzij de waarde een
Zend_Db_Expr
. is object, in welk geval het woordelijk wordt geïnterpoleerd, zodat u expressies ofNULL
kunt invoegen of wat dan ook. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Tabelnaam en kolomnamen zijn gescheiden, tenzij u
AUTO_QUOTE_IDENTIFIERS
uitschakelt .Waarden zijn geparametriseerd, tenzij ze
Zend_Db_Expr
. zijn objecten, zoals ininsert()
methode.De
$where
argument is helemaal niet gefilterd, dus u bent verantwoordelijk voor eventuele SQL-injectie-risico's in die. U kunt gebruik maken van dequoteInto()
methode om het citeren gemakkelijker te maken.