Jeg skrev meget af koden til databaseparametre og citerede i Zend Framework, mens jeg var teamleder for projektet (op til version 1.0).
Jeg forsøgte at opmuntre til bedste praksis, hvor det var muligt, men jeg var nødt til at finde en balance med brugervenlighed.
Bemærk, at du altid kan undersøge strengværdien af en Zend_Db_Select
objekt, for at se, hvordan den har besluttet at citere.
print $select; // invokes __toString() method
Du kan også bruge Zend_Db_Profiler
at inspicere den SQL, der køres på dine vegne af Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Her er nogle svar på dine specifikke spørgsmål:
-
Zend_Db_Select::where('last_name=?', $lname)
Værdier er citeret korrekt. Selvom "
?
" ligner en parameterpladsholder, i denne metode er argumentet faktisk citeret korrekt og interpoleret. Så det er ikke en sand forespørgselsparameter. Faktisk producerer de følgende to udsagn nøjagtig den samme forespørgsel som ovenstående brug:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Men hvis du sender en parameter, der er et objekt af typen
Zend_Db_Expr
, så er det ikke citeret. Du er ansvarlig for SQL-injektionsrisici, fordi det er interpoleret ordret, for at understøtte udtryksværdier:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Enhver anden del af det udtryk, der skal citeres eller afgrænses, er dit ansvar. Hvis du f.eks. interpolerer PHP-variabler i udtrykket, er sikkerheden dit ansvar. Hvis du har kolonnenavne, der er SQL-nøgleord, skal du selv afgrænse dem med
quoteIdentifier()
. Eksempel:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Tabelnavn og kolonnenavne er afgrænset, medmindre du slår
AUTO_QUOTE_IDENTIFIERS
fra .Værdier parametreres som sande forespørgselsparametre (ikke interpoleret). Medmindre værdien er en
Zend_Db_Expr
objekt, i hvilket tilfælde det er interpoleret ordret, så du kan indsætte udtryk ellerNULL
eller hvad som helst. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Tabelnavn og kolonnenavne er afgrænset, medmindre du slår
AUTO_QUOTE_IDENTIFIERS
fra .Værdier parametreres, medmindre de er
Zend_Db_Expr
objekter, som iinsert()
metode.$where
argumentet filtreres slet ikke, så du er ansvarlig for eventuelle SQL-injektionsrisici i den. Du kan gøre brug afquoteInto()
metode til at gøre det mere bekvemt at citere.