БлогNot. Как перейти с MySQL на MySQLi?

Как перейти с 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 [5681 просмотр]


теги: php mysql сервер

К этой статье пока нет комментариев, Ваш будет первым