Из трех вариантов, единственный, который вы должны избегать, это # 1. Не используйте магические куки в вашем коде. Поместив константы либо в пространство имен, либо в класс, вы упростите расширение и поддержку своего кода в будущем.
Если ваши константы имеют глобальный характер, то между 2 и 3 это мало что значит. Важно то, что вы выбираете один и придерживаетесь его. Но если у вас есть константы, которые применяются к определенному классу, то они должны быть частью этого класса.
Лично я бы использовал пространство имен для большинства вещей.
Я написал много кода для параметров базы данных и цитирования в 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-> где ('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 ()
, чтобы сделать цитирование более удобным.
по умолчанию, когда вы используете привязку значений в ваших SQL-запросах, например:
where('first_name=?', $id);
Zend_Db использует соответствующие кавычки для значений, чтобы предотвратить SQL-инъекцию. хотя настоятельно рекомендуется (из книг, статей, руководств и собственного опыта) очищать / фильтровать вводимые пользователем данные. Zend_Filter может быть очень полезным.
Да. См. http://framework.zend.com/manual/en/zend.db.select.html . Не волнуйся. Вы правы, когда относитесь к этому скептически.
Если он вам нужен где-то еще (например, в соединении) или вы не уверены, будет ли он экранирован, вы всегда можете использовать $ this-> getAdapter () -> quoteInto (' type =? ', 1);
Входная фильтрация всегда хороша, потому что, вероятно, она будет куда-то, кроме БД, и вам, по крайней мере, нужны разумные данные в вашей базе данных на каком-то уровне.
Zend_Filter_Input
в пути в Одна вещь об этом: когда значение равно NULL, вы можете получить недействительный запрос
$value = NULL;
$select->where('prop=?', $value);
Результат: ошибка SQL
Бит, который должен заставить вас чувствовать себя в безопасности, - это? отметки в предложениях where. Это параметры, которые система базы данных безопасно заменяет вторым аргументом.