переключить на mysqli хорошую идею?

Я рассматриваю переключение на mysqli для всех моих php проектов. Путем мой код написан (я выполняю очень простые веб-сайты и создал мою собственную основную платформу, которую я использую через всех них), у меня не должно быть слишком многих проблем при изменении функций и классов.

Однако я только услышал положительные моменты о подготовленных операторах, панель несколько ворчания о доступных функциях php, прежде всего отсутствие простой замены для использования mysql_fetch_array в некоторое время.

Это звучит немного слишком хорошо, чтобы быть правдой, таким образом, я задался вопросом, мог ли кто-либо выделить некоторые проблемы с использованием подготовленных операторов, таких как скорость и использование ресурсов.

7
задан Rob 24 March 2010 в 17:03
поделиться

2 ответа

Подготовленные операторы настолько хороши, что, как только вы привыкнете к ним, будет болезненно снова использовать экранирующие функции. Период.

Однако все библиотеки БД, которые я когда-либо использовал (включая oci8 и sqlsrv ...), вводят ту или иную причуду. Поэтому я в основном инкапсулирую любую библиотеку, которую я использую, с простым набором настраиваемых классов, которые предоставляют функции таким образом, как Я , например:

  • Параметры на основе имени: WHERE foo =: ​​foo
  • Параметр передается по значению в ассоциативном массиве (вместо привязки к отдельным переменным PHP): $ params = array ('foo' => 33)
  • Выполнение одной строки: $ res = $ Db-> query ( $ sql, $ params);
  • Наборы результатов - это объекты, реализующие интерфейс Iterator , поэтому я могу выполнить цикл с помощью foreach ($ res as $ row)

. синтаксис или набор функций менее важны.

Как бы то ни было, хотя это можно сделать практически с любой библиотекой, полезно, если она обеспечивает привязку собственных параметров, поэтому (например) вам не нужно угадывать тип данных. Кроме того, некоторые расширенные функции, такие как транзакции, нельзя просто выполнить с помощью простых функций mysql.

PDO мог бы быть хорошей альтернативой, но большинство его драйверов в основном заброшено, поэтому вы фактически теряете преимущество наличия уровня абстракции, не зависящего от БД, в то время как вам нравятся его подводные камни.

IMHO, сам факт того, что вы спрашиваете, предполагает, что вы должны дать mysqli шанс.

2
ответ дан 7 December 2019 в 14:30
поделиться

Программирование для подготовленных операторов требует некоторого привыкания, если вы привыкли просто добавлять переменные к строкам запроса. MySQL использует позиционные параметры (ваш запрос будет содержать вопросительные знаки, которым принадлежат переменные замены). Лучше всего поместить это в существующую абстракцию базы данных. Если эта абстракция была написана правильно, вам все равно не следует вызывать mysql_fetch_array вне оболочки.

Решение этой проблемы состоит в том, чтобы просто собрать все строки заранее, но, конечно, это предполагает, что вы не извлекаете 1000 строк, а просто запрашиваете первую. Это изменение, которое вы должны сделать независимо от mysqli.

Наконец, некоторые операторы нелегко заменить параметрами, например, запросы, использующие синтаксис in ('x', 'y', 'z') с переменным количеством аргументов. Это можно сделать, но вы, вероятно, захотите обогатить абстракцию своей базы данных, чтобы она могла создавать запросы, а также выполнять их.

Однако компромисс, безусловно, того стоит, с точки зрения производительности и безопасности. Дополнительная обработка на стороне PHP обычно перевешивается кешированными планами выполнения запросов на стороне MySQL, и вы неуязвимы для многих наиболее распространенных уязвимостей SQL-инъекций.

Надеюсь, что это поможет, Джо

2
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: