2014-10-20 3 views
21

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

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

ответ

35

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

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

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. Взгляните на How can I prevent SQL injection in 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(); 

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

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

+2

Нет такой кошерной версии такого преобразования. Любое преобразование должно включать подготовленные заявления. В противном случае это не имеет никакого смысла. –

+0

@YourCommonSense В этом разница между конверсией и рефакторингом. Каждый должен реорганизовать свой код для использования подготовленных операторов, и я указываю, что в моем ответе, но это не то же самое, что конвертировать из 'ext: mysql' в' ext: mysqli', о чем спрашивает этот вопрос. – worldofjr

+0

«Новые mysqli()» и «mysqli_query ($ link, $ sqlStatement)» меняли мою страницу. Обновлено до Ubuntu 16, а стек лампы - с php 7. Все старые функции mysql устарели после 5.something. Благодарю. – user208145

2

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

4

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