Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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) Закрыть соединение

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

mysqli_close($mysqli);

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

$mysqli->close();

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

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

Ответ 2

Если вы не можете преобразовать все вызовы в функции 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"; }

Ответ 3

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