Могу ли я слепо заменить все функции mysql_ на mysqli_?

Я использовал mysql_query() течение всего моего проекта; но я только что узнал, что mysql_ устарел с PHP 5.5, был удален в PHP 7.

Итак, я хотел бы знать, могу ли я в любой mysql_ заменить все mysql_ функции mysqli_ в моем проекте? Например, просто заменив mysql_query() на mysqli_query() . Есть ли побочный эффект?

Короткий ответ – нет , функции не эквивалентны.

Хорошей новостью является инструмент конвертера, который поможет вам, если у вас есть много вызовов / проектов для изменения. Это позволит вашим скриптам работать сразу.

https://github.com/philip/MySQLConverterTool

Это раздвоенная версия оригинальной версии Oracle, и она кошерная.

Тем не менее, это не так сложно обновить ваш код, и вы, возможно, захотите перейти на объектно-ориентированную методологию …

1) Соединение

Для всех целей и задач вам нужна новая функция соединения, которая сохраняет соединение как переменную PHP, например;

 $mysqli = new mysqli($host,$username,$password,$database); 

Заметьте, что я сохранил подключение к $mysqli . Вы можете сохранить до $db или что угодно, но вы должны использовать это во всем своем коде для ссылки на соединение.

Однако не забудьте проверить ошибку подключения;

 if ($mysqli->connect_errno) echo "Error - Failed to connect to MySQL: " . $mysqli->connect_error; 

2) Запрос

Примечание. Вы должны защищать от SQL-инъекции с помощью подготовленных операторов, которые доступны в MySQLi. Посмотрите, как я могу предотвратить SQL-инъекцию в PHP? , но я просто собираюсь осветить основы здесь.

Теперь вам нужно включить соединение в качестве аргумента в свой запрос и другие функции mysqli_ . В процедурном коде это первый аргумент, в OO вы пишете его как метод класса;

Процедурный:

 $result = mysqli_query($mysqli,$sql); 

OO:

 $result = $mysqli->query($sql); 

3) Получить результат

Получение результата аналогично старой функции mysql_ в процедурной;

 while($row = mysqli_fetch_assoc($result)) 

но поскольку $result теперь является объектом в mysqli, вы можете использовать вызов функции объекта;

 while($row = $result->fetch_assoc()) 

4) Закрыть соединение

Как и раньше, вам нужно включить соединение в функцию close; как аргумент в процедуре;

 mysqli_close($mysqli); 

и как объект, в котором вы запускаете функцию в OO;

 $mysqli->close(); 

Я был бы здесь навсегда, если бы я прошел через все их, но у вас есть идея. Взгляните на документацию для получения дополнительной информации. Не забудьте преобразовать любые функции закрытия соединения, результата или функции подсчета и подсчета строк.

Основное правило – для функций, которые используют соединение с базой данных, теперь вы должны включить его в функцию (либо в качестве первого аргумента в процедуре, либо в объект, который вы используете для вызова функции в OO), либо для набора результатов вы можете просто изменить функцию на mysqli_ или использовать результирующий набор в качестве объекта.

Если вы не можете преобразовать все вызовы функций mysqli в старый проект, вы можете установить и включить библиотеку php7-mysql-shim .

Он попытается создать прозрачную замену mysql на PHP 7 с помощью mysqli. Очевидно, что производительность медленнее, но это решение, чтобы обойти проблему через пару минут. Вы можете смело включать библиотеку в проекты, работающие с PHP 5.6 (это будет проигнорировано).

 if (defined('PHP_VERSION_ID') && (PHP_VERSION_ID >= 50600)) { require_once "mysql-shim.php"; } 

Вы не можете. некоторые из функций mysql и mysqli требуют разных параметров. Поэтому вы должны знать, какие будут использовать те же параметры.