Как перейти с MySQL на MySQLi?
Как известно, расширение MySQL, применяемое в большинстве скриптов на PHP, работающих с базой данных, с версии PHP 5.5 устарело, а с версии 7.0 будет удалено.
Легко ли для существующего сайта перейти с MySQL на рекомендуемое MySQLi? Я считаю, что да, ведь формат БД не изменился, а процедурный стиль обращения к новым функциям сохранён, так что работа будет небольшой.
Во-первых, у большинства функций достаточно заменить имя типа mysql_select_db
на имя типа mysqli_select_db
,
во-вторых, кое-где придётся поменять параметры (добавить идентификатор соединения или поменять параметры местами, как у
mysqli_query
против
mysql_query),
в-третьих, некоторые функции, не имеющие прямых аналогов в MySQLi, такие как
mysql_result, можно "обернуть" в код, написанный при помощи новых рекомендуемых функций, например:
if (!function_exists('mysql_result')) { function mysql_result($result, $number, $field=0) { mysqli_data_seek($result, $number); $row = mysqli_fetch_array($result); return $row[$field]; } }
Кроме того, если вы не писали вызова mysql_connect
перед каждым запросом, а применяли модуль, в котором собраны функции для работы с БД, достаточно будет поменять только этот модуль.
Например, приведённый по последней ссылке модуль db.php
для обеспечения работы с MySQLi изменится только следующим образом:
<?php if (!isset($conid)) { function dbconnect() { $mysql=mysqli_connect(DB_HOST, DB_USER, DB_PASS); //хост, логин, пароль mysqli_select_db($mysql,DB_NAME); //имя базы данных return $mysql; } function dbquery ($sql){ $result=mysqli_query(get_conid(),$sql); return $result; } function dbfetcha ($result){ if ($row=mysqli_fetch_assoc ($result)) return $row; else return false; } function dbfetch ($result){ if ($row=mysqli_fetch_array($result)) return $row; else return false; } function dbrows ($result){ $num=mysqli_num_rows($result); return $num; } function dbfree ($result){ mysqli_free_result ($result); } function dbclose ($conid) { mysqli_close(get_conid()); } function get_conid () { static $conid=0; if (!$conid) $conid=dbconnect(); return $conid; } get_conid (); } ?>
Как видно, изменения с внешней стороны мизерны, с "внутренней" же мы вправе ожидать более безопасной работы скриптов и лучшего кэширования запросов.
Правда, вместе с MySQL устареют и ещё некоторые функции, типа mysql_real_escape_string, с ними следует поступить по тем же рецептам, написав вместо
$text = mysql_real_escape_string($text);
код вида
$text = mysqli_real_escape_string(get_conid(),$text);
Для htmlspecialchars
в новых версиях PHP нужно указывать не 1, а 3 аргумента,
как написано в этой заметке.
Соответственно, у меня перевод этого блога на MySQLi занял минут 5 :)
09.12.2017, 15:06 [6106 просмотров]