Я использовал 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 требуют разных параметров. Поэтому вы должны знать, какие будут использовать те же параметры.