Когда я пытаюсь подключиться к серверу 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
Что произойдет, если я это сделаю?
Почему это происходит?
Все расширение 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 – добавление соответствующей строки с помощью @
если это будет подавлять все ошибки, вызванные этим выражением, а не только E_DEPRECATED
.
Вы начинаете новый проект.
Нет абсолютно никаких оснований использовать ext/mysql
вместо этого используйте один из других, более современных расширений и воспользуйтесь преимуществами, которые они предлагают.
У вас есть (ваша собственная) устаревшая база кода, которая в настоящее время зависит от ext/mysql
.
Было бы разумно выполнить регрессионное тестирование: вы действительно не должны ничего менять (особенно обновлять PHP), пока не определите все потенциальные области воздействия, которые планируются вокруг каждого из них, а затем тщательно протестировали ваше решение в промежуточной среде.
Следуя хорошей практике кодирования, ваше приложение было разработано свободно интегрированным / модульным способом, и методы доступа к базе данных полностью автономны в одном месте, которые можно легко поменять на одно из новых расширений.
Проведите полчаса перезаписи этого модуля, чтобы использовать один из других, более современных, расширений; тщательно протестируйте. Впоследствии вы можете внести дополнительные усовершенствования, чтобы получить вознаграждение за преимущества, которые они предлагают.
Методы доступа к базе данных разбросаны по всему месту и не могут быть легко заменены для одного из новых расширений.
Подумайте, действительно ли вам нужно перейти на PHP v5.5 в это время.
Вы должны начать планировать замену ext/mysql
одним из других, более современных расширений, чтобы вы могли получить вознаграждение за преимущества, которые они предлагают; вы также можете использовать его как возможность реорганизовать методы доступа к базе данных в более модульную структуру.
Однако, если у вас есть срочная необходимость сразу обновить PHP, вы можете рассмотреть возможность подавления ошибок устаревания на данный момент: но сначала обязательно определите любые другие ошибки устаревания, которые также возникают.
Вы используете сторонний проект, который зависит от ext/mysql
.
Подумайте, действительно ли вам нужно перейти на PHP v5.5 в это время.
Убедитесь, что разработчик опубликовал какие-либо исправления, обходные пути или рекомендации относительно этой конкретной проблемы; или, если нет, надавить на них, доведя этот вопрос до их внимания. Если у вас есть срочная необходимость сразу обновить PHP, вы можете рассмотреть возможность подавления ошибок устаревания на данный момент: но сначала обязательно определите любые другие ошибки устаревания, которые также возникают.
Совершенно необходимо проводить регрессионное тестирование.