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