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

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

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

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

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

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

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

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

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

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Что будет, если я это сделаю?

1 ответ

Решение
  1. Почему это происходит?

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

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

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

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

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

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

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

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

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Что будет, если я это сделаю?

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам