#Когда возникает проблема и как её отличить
После обновления PHP старое приложение может перестать подключаться к MySQL: удалённые mysql_* вызовы, отсутствующий драйвер PDO/mysqli и изменение режима обработки ошибок требуют разных исправлений.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Используется удалённый API mysql_*Расширение mysql было удалено из PHP 7, а в PHP 8 его нет. | Ошибка Call to undefined function mysql_connect() | Переписать обращения на mysqli или PDO. |
| Не установлен драйвер базыВеб-PHP не загрузил pdo_mysql для текущей версии. | Ошибка could not find driver при PDO | Включить совместимое расширение для PHP-FPM. |
| PDO теперь сообщает исключениемС PHP 8 по умолчанию включён режим ошибок PDO::ERRMODE_EXCEPTION. | После смены версии стали видны ошибки SQL как PDOException | Исправить сам SQL и обработать исключение без утечки секретов. |
#Пошаговая диагностика и исправление
- Выясните точную ошибку обращения к базеОткройте журнал PHP для проблемного веб-запроса:
Call to undefined function mysql_query,could not find driver,Access deniedиPDOExceptionтребуют разных действий. Не меняйте пароль, порт и привилегии без указания на ошибку аутентификации. Сохраните резервную копию кода и базы перед миграцией API. - Определите, чем код подключается к базеВ редакторе проекта найдите
mysql_connect,mysqli_connectиnew PDO. Если старый APImysql_*присутствует, его нельзя восстановить установкой модуля для PHP 8. Составьте список запросов и заменяйте их на PDO/mysqli поэтапно в тестовой копии. - Проверьте расширение именно для веб-версииВ панели хостинга откройте активную версию PHP и включённые расширения. Для кода PDO с MySQL нужен драйвер
pdo_mysql, для mysqli — расширениеmysqli. Консольная командаphp -mполезна, но показывает только CLI. На закрытой странице приложения проверьтеextension_loaded("pdo_mysql")илиextension_loaded("mysqli")и удалите страницу после теста. - Подготовьте безопасное новое соединениеПри переходе с
mysql_*на PDO задайте DSN с действительными host/dbname/charset, явно включитеPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONи используйте подготовленные запросы с параметрами для пользовательского ввода. Точное имя базы и секреты берите из существующей закрытой конфигурации. Не публикуйте пароль и не подставляйте его в командную строку с историей оболочки. - Разберите сообщение SQL отдельно от ошибки PHPЕсли драйвер есть, но соединение падает с
SQLSTATE, смотрите код и текст без секретов:Access deniedотносится к учётным данным,Unknown database— к имени базы, ошибки синтаксиса — к запросу. Выполняйте проверки в тестовой базе с минимумом прав; не используйте общий аккаунт root для приложения. - Проверьте чтение и запись на тестовой базеСначала выполните только чтение известной записи. Затем создайте тестовую запись и откатите её с помощью транзакции или удалите штатным способом, если это предусмотрено. Сравните строки и кодировку с прежним вариантом. Если запросы не проходят, верните предыдущие файлы приложения и проверьте журнал; на живой базе эксперименты не проводите.
- Командная строка под обычным пользователем: только перечень расширений CLILinux · Терминал (Bash)КомандаКомандная строка под обычным пользователем: только перечень расширений CLI. Веб-версию проверяют отдельно.
php -m
#Как проверить, что проблема устранена
Должны выполняться отдельные проверки подключения, чтения и контролируемой записи. В журнале не должно остаться undefined function/could not find driver, а при некорректных учётных данных приложение должно возвращать безопасное сообщение, а не показывать пароль или SQL.
#Если ошибка осталась
Повторите исходный сценарий в тестовой среде, откройте свежую запись журнала с точным временем, именем функции, файлом и строкой. Сравните новое сообщение с исходным: ошибка могла переместиться на следующий участок кода. Не подавляйте все ошибки общим обработчиком. Если изменения затрагивали работающий проект, восстановите сохранённую копию и разберите новое сообщение до повторного переноса.