Я рассматриваю переключение на mysqli для всех моих php проектов. Путем мой код написан (я выполняю очень простые веб-сайты и создал мою собственную основную платформу, которую я использую через всех них), у меня не должно быть слишком многих проблем при изменении функций и классов.
Однако я только услышал положительные моменты о подготовленных операторах, панель несколько ворчания о доступных функциях php, прежде всего отсутствие простой замены для использования mysql_fetch_array в некоторое время.
Это звучит немного слишком хорошо, чтобы быть правдой, таким образом, я задался вопросом, мог ли кто-либо выделить некоторые проблемы с использованием подготовленных операторов, таких как скорость и использование ресурсов.
Подготовленные операторы настолько хороши, что, как только вы привыкнете к ним, будет болезненно снова использовать экранирующие функции. Период.
Однако все библиотеки БД, которые я когда-либо использовал (включая oci8 и sqlsrv ...), вводят ту или иную причуду. Поэтому я в основном инкапсулирую любую библиотеку, которую я использую, с простым набором настраиваемых классов, которые предоставляют функции таким образом, как Я , например:
WHERE foo =: foo
$ params = array ('foo' => 33)
$ res = $ Db-> query ( $ sql, $ params);
foreach ($ res as $ row)
. синтаксис или набор функций менее важны.
Как бы то ни было, хотя это можно сделать практически с любой библиотекой, полезно, если она обеспечивает привязку собственных параметров, поэтому (например) вам не нужно угадывать тип данных. Кроме того, некоторые расширенные функции, такие как транзакции, нельзя просто выполнить с помощью простых функций mysql.
PDO мог бы быть хорошей альтернативой, но большинство его драйверов в основном заброшено, поэтому вы фактически теряете преимущество наличия уровня абстракции, не зависящего от БД, в то время как вам нравятся его подводные камни.
IMHO, сам факт того, что вы спрашиваете, предполагает, что вы должны дать mysqli шанс.
Программирование для подготовленных операторов требует некоторого привыкания, если вы привыкли просто добавлять переменные к строкам запроса. MySQL использует позиционные параметры (ваш запрос будет содержать вопросительные знаки, которым принадлежат переменные замены). Лучше всего поместить это в существующую абстракцию базы данных. Если эта абстракция была написана правильно, вам все равно не следует вызывать mysql_fetch_array вне оболочки.
Решение этой проблемы состоит в том, чтобы просто собрать все строки заранее, но, конечно, это предполагает, что вы не извлекаете 1000 строк, а просто запрашиваете первую. Это изменение, которое вы должны сделать независимо от mysqli.
Наконец, некоторые операторы нелегко заменить параметрами, например, запросы, использующие синтаксис in ('x', 'y', 'z')
с переменным количеством аргументов. Это можно сделать, но вы, вероятно, захотите обогатить абстракцию своей базы данных, чтобы она могла создавать запросы, а также выполнять их.
Однако компромисс, безусловно, того стоит, с точки зрения производительности и безопасности. Дополнительная обработка на стороне PHP обычно перевешивается кешированными планами выполнения запросов на стороне MySQL, и вы неуязвимы для многих наиболее распространенных уязвимостей SQL-инъекций.
Надеюсь, что это поможет, Джо