Написах голяма част от кода за параметрите на базата данни и цитирането в 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()
метод, който да ви помогне да направите цитирането по-удобно.