У нас есть приложение, которое находится в разработке (и сейчас в производстве) уже более года. В общей сложности более 500 mysql_*
.
Стоит ли переключать все mysql_*
в код на mysqli_*
Стоит ли гоняться за всеми ошибками, которые могут (и, скорее всего, будут) появляться?
Я вижу из таких вопросов: Изменение этого с MySQL на MySQLi? что просто добавление i
после каждого вызова mysql*
может привести ко многим ошибкам. Стоит ли мое время?
mysql_*
, вероятно, будет в течение долгого времени (даже среди слухов об устаревании), так что это действительно стоит программистам время, чтобы методично переключиться?
См. Также эту дискуссию
Указание руководства для ext/mysqli
:
Расширение mysqli имеет ряд преимуществ, ключевые улучшения над расширением mysql:
- Объектно-ориентированный интерфейс
- Поддержка подготовленных заявлений
- Поддержка нескольких заявлений
- Поддержка транзакций
- Расширенные возможности отладки
- Поддержка встроенного сервера
Примечание. Если вы используете MySQL версии 4.1.3 или новее, настоятельно рекомендуется использовать это расширение.
Если вам нужна только одна из этих функций и вы можете позволить себе рефакторинг, то да, пойдите для этого. Если вам не нужны какие-либо из этих функций, не делайте этого. Нет никаких оснований для реорганизации, если нет никаких преимуществ.
Слухи об этом говорят. ext / mysql , скорее всего, будет устаревшим (хотя никто не может сказать, когда на момент написания этой статьи. Конечно, он не будет устаревшим с 5.4, и он, скорее всего, будет доступен как расширение pecl навсегда). В любом случае вы не должны запускать никаких новые проекты с ext / mysql, когда у вас есть превосходное расширение для начала.
Также см. http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/
На мой взгляд, преимущество MySQLi заключается в том, что оно используется объектно-ориентированным способом и с подготовленными операторами. Вы получаете дополнительную гибкость от него, используя процедурный стиль, например, хорошие функции обертки вокруг обработки транзакций, но я думаю, недостаточно для оправдания, если вы не переписываете много своего кода, чтобы использовать их.
И если вы должны предпринять усилия для преобразования в OO-код или подготовленные операторы, вы можете также преобразовать в более гибкий PDO, а не в MySQLi.
Обновление за январь 2013 г.
Просто нашел этот старый ответ, и в ответе на комментарий в августе 2011 года я сказал, что не стоит преобразовывать mysql_query()
в mysqli_query()
не сопровождающие переход к подготовленным mysqli_query()
. Теперь необходимо начать движение в этом направлении, поскольку расширение mysql_*()
устарело с PHP 5.5 и в конечном итоге будет удалено.
MySQLi имеет некоторые преимущества в производительности по сравнению с MySQL. На самом деле рекомендуется использовать MySQLi вместо MySQL. Вы также можете выполнить процедурный стиль.
Вы можете создать новую ветвь своего приложения и изменить код на функции mysqli_*
. Это должно быть довольно прямолинейно, и при этом вы будете просматривать код доступа к базе данных, который может помочь при переходе к mysqli для продолжения рефакторинга. Если это слишком много хлопот, вы уже воспользовались улучшенной версией клиентской библиотеки в вашем коде доступа к базе данных.
Отказ от ext / mysql – это не слухи.
Однако это не ваша настоящая проблема.
Основная проблема заключается в том, что вы используете naked API-вызовы по всему коду вместо использования какой-либо интеллектуальной библиотеки для обработки SQL-запросов.
Итак, вам лучше начать создавать такую библиотеку или получить готовый, а затем переписать код для использования его вызовов.
Разве вы не видите, что все эти повторяющиеся вещи
$res=mysql_query("SELECT STUFF"); while($row = mysql_fetch){ $var=$row['col']; }
невероятно скучно?
почему бы не использовать какой-то однострочный
$data = $db->getRow("SELECT stuff");
который короче и может иметь множество функций, таких как ведение журнала запросов, подсчет, отладка, обработка ошибок и т. д.
И, как побочный эффект использования такой библиотеки, единственным местом, где вам нужно будет изменить любые вызовы API, будет только этот код библиотеки.
На мой взгляд, вы не должны использовать функцию mysql_ * непосредственно в своей логике. Вы должны написать обертку. Поэтому, когда вы хотите переключить mysql_*
на mysqli_*
, вам нужно только изменить код оболочки.
Если у вас есть много вызовов, я предлагаю вам начать с реализации (выбора или создания) уровня абстракции для вызовов базы данных, а затем конвертировать это.
Самым большим преимуществом (существенным) в моем аналогичном упражнении было то, что mysqli предлагает параметризованные операторы, позволяющие оставить mysql_real_escape_string и т. Д. Но карта от одного к другому не является почти одним-к-одному.
Совет. Если вы собираетесь сделать переключатель, не переключитесь на mysqli, а переключитесь на использование PDO. Если вы должны переключиться на mysqli, убедитесь, что вы используете его в PHP5 OO. Не используйте mysqli OO и старый mysql одновременно или старые mysql и PDO одновременно, если вам не нравится неожиданное соединение.