Расширение 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. Почему это происходит?

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

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

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

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

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

    Совершенно необходимо проводить регрессионное тестирование.