Я написал много кода для параметров базы данных и процитировать 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()
, чтобы сделать предложение более удобным.
Отличный ответ, Билл и отличный компонент all round :) –
Если вы используете функцию 'insert()' в экземпляре 'TableGateway', экранирование столбцов с зарезервированными именами будет автоматически выполнено для вас, как указано во втором марке выше. Если вы вручную удалите его (т. Е. (SQL Server) »array ([from] => 1));' он выдает ошибку базы данных, в которой '' [from] ''является недопустимым именем столбца. Этот столбец мог быть дважды экранирован как '[[from]]' –