Написах голяма част от кода за параметрите на базата данни и цитирането в Zend Framework, докато бях ръководител на екипа за проекта (до версия 1.0).
Опитах се да насърчавам най-добрите практики, където е възможно, но трябваше да намеря баланс с лекота на използване.
Имайте предвид, че винаги можете да проверите стойността на низа на Zend_Db_Select възразите, за да видите как е решил да направи цитиране.
print $select; // invokes __toString() method
Също така можете да използвате Zend_Db_Profiler за да проверите SQL, който се изпълнява от ваше име от Zend_Db .
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Ето някои отговори на вашите конкретни въпроси:
-
Zend_Db_Select::where('last_name=?', $lname)Стойностите са цитирани по подходящ начин. Въпреки че „
?" изглежда като заместител на параметър, в този метод аргументът всъщност се цитира по подходящ начин и се интерполира. Така че това не е истински параметър на заявката. Всъщност следните две изрази произвеждат точно същата заявка като горната употреба:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );Ако обаче предадете параметър, който е обект от тип
Zend_Db_Expr, тогава не се цитира. Вие носите отговорност за рисковете от инжектиране на SQL, тъй като е интерполирано дословно, за да поддържа стойностите на израза:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))Всяка друга част от този израз, която трябва да бъде цитирана или разграничена, е ваша отговорност. Например, ако интерполирате PHP променливи в израза, безопасността е ваша отговорност. Ако имате имена на колони, които са ключови думи на SQL, трябва сами да ги разделите с
quoteIdentifier(). Пример:$select->where($db->quoteIdentifier('order').'=?', $myVariable) -
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )Името на таблицата и имената на колоните са разделени, освен ако не изключите
AUTO_QUOTE_IDENTIFIERS.Стойностите се параметризират като истински параметри на заявката (не интерполирани). Освен ако стойността не е
Zend_Db_Exprобект, в който случай е интерполиран дословно, така че можете да вмъквате изрази илиNULLили каквото и да е. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )Името на таблицата и имената на колоните са разделени, освен ако не изключите
AUTO_QUOTE_IDENTIFIERS.Стойностите са параметризирани, освен ако не са
Zend_Db_Exprобекти, както вinsert()метод.$whereаргументът изобщо не се филтрира, така че вие носите отговорност за всички рискове от SQL инжектиране в този. Можете да използватеquoteInto()метод, който да ви помогне да направите цитирането по-удобно.