Расширение mysql устарело и будет удалено в будущем: вместо этого используйте mysqli или PDO

Когда я пытаюсь подключиться к серверу MySQL с PHP, я вижу следующую ошибку:

Устаревшее: расширение mysql устарело и будет удалено в будущем: используйте mysqli или PDO вместо этого в /path/to/filename.php в строке 123

Код в указанной строке:

mysql_connect($server, $username, $password);

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

  • Почему это происходит?

  • Как я могу его исправить?

  • Я понимаю, что можно исключить ошибки устаревания, установив error_reporting в php.ini, чтобы исключить E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Что произойдет, если я это сделаю?

Ответ 1

  • Почему это происходит?

    Полное расширение ext/mysql PHP, которое предоставляет все функции с именем prefix mysql_, было официально устарело в PHP v5.5.0 и удален в PHP v7.

    Он был первоначально представлен в PHP v2.0 (ноябрь 1997 г.) для MySQL v3.20, и с 2006 года никаких новых функций не было добавлено. В сочетании с отсутствием новых функций возникают трудности с сохранением такого старого кода среди сложных уязвимостей безопасности.

    В руководстве содержатся предупреждения от его использования в новом коде с июня 2011 года.

  • Как я могу это исправить?

    Как следует из сообщения об ошибке, есть два других расширения MySQL, которые вы можете рассмотреть: MySQLi и PDO_MySQL, любой из которых можно использовать вместо ext/mysql. Оба были в ядре PHP с версии v5.0, поэтому, если вы используете версию, которая бросает эти ошибки, то вы почти наверняка сразу начнете их использовать сразу. без каких-либо усилий по установке.

    Они немного отличаются друг от друга, но предлагают ряд преимуществ перед старым расширением, включая поддержку API для транзакций, хранимых процедур и подготовленных операторов (тем самым обеспечивая лучший способ Атаки SQL-инъекций). Разработчик PHP Ульф Вендел написал подробное сравнение функций.

    В Hashphp.org есть отличный отличный учебник по миграции из ext/mysql в PDO.

  • Я понимаю, что можно подавить ошибки устаревания, установив error_reporting в php.ini, чтобы исключить E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Что произойдет, если я это сделаю?

    Да, можно подавить такие сообщения об ошибках и продолжать использовать старое расширение ext/mysql. Но вам действительно не следует это делать — это окончательное предупреждение разработчиков о том, что расширение не может быть связано с будущими версиями PHP (действительно, как уже упоминалось, он был удален из PHP v7). Вместо этого вы должны воспользоваться этой возможностью, чтобы перенести приложение прямо сейчас, пока не стало слишком поздно.

    Обратите внимание, что этот метод будет подавлять все сообщения E_DEPRECATED, а не только те, которые связаны с расширением ext/mysql: поэтому вы можете не знать о других предстоящих изменениях PHP, которые повлияют на ваш код приложения. Разумеется, возможно только подавление ошибок, возникающих в рассматриваемом выражении, с помощью PHP оператора управления ошибками и— добавив соответствующую строку с помощью @ &mdash, однако это будет подавлять все ошибки, вызванные этим выражением, а не только E_DEPRECATED.


Что вы должны делать?

  • Вы начинаете новый проект.

    Нет никаких оснований использовать ext/mysql — вместо этого выберите один из других, более современных расширений и воспользуйтесь преимуществами, которые они предлагают.

  • У вас есть (ваша собственная) устаревшая база кода, которая в настоящее время зависит от ext/mysql.

    Было бы разумно выполнить регрессионное тестирование: вы действительно не должны ничего менять (особенно обновлять PHP), пока не определите все потенциальные области воздействия, запланированные вокруг каждого из них, а затем тщательно протестировали свое решение в промежуточной среды.

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

      Проведите полчаса перезаписи этого модуля, чтобы использовать один из других, более современных, расширений; тщательно протестируйте. Впоследствии вы можете ввести дополнительные уточнения, чтобы получить вознаграждение за преимущества, которые они предлагают.

    • Методы доступа к базе данных разбросаны по всему месту и не могут быть легко заменены для одного из новых расширений.

      Рассмотрим, действительно ли вам нужно обновить до версии PHP v5.5 в настоящее время.

      Вы должны начать планировать замену ext/mysql одним из других, более современных расширений, чтобы вы могли получить вознаграждение за преимущества, которые они предлагают; вы также можете использовать его как возможность реорганизовать методы доступа к базе данных в более модульную структуру.

      Однако, если у вас есть срочная необходимость сразу же обновить PHP, вы можете рассмотреть возможность подавления ошибок устаревания на данный момент: но сначала обязательно определите любые другие ошибки устаревания, которые также возникают.

  • Вы используете сторонний проект, который зависит от ext/mysql.

    Рассмотрим, действительно ли вам нужно обновить до версии PHP v5.5 в настоящее время.

    Проверить, выпустил ли разработчик какие-либо исправления, обходные решения или рекомендации по этой конкретной проблеме; или, если нет, надавить на них, доведя этот вопрос до их внимания. Если у вас есть срочная необходимость сразу обновить PHP, вы можете рассмотреть возможность подавления ошибок устаревания на данный момент: но сначала обязательно укажите любые другие ошибки устаревания, которые также возникают.

    Абсолютно необходимо выполнить регрессионное тестирование.