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_IDENTIFIERSfra .Værdier parametreres som sande forespørgselsparametre (ikke interpoleret). Medmindre værdien er en
Zend_Db_Exprobjekt, i hvilket tilfælde det er interpoleret ordret, så du kan indsætte udtryk ellerNULLeller hvad som helst. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )Tabelnavn og kolonnenavne er afgrænset, medmindre du slår
AUTO_QUOTE_IDENTIFIERSfra .Værdier parametreres, medmindre de er
Zend_Db_Exprobjekter, som iinsert()metode.$whereargumentet 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.