直接结论:不是代码写错了,是PHP运行时没加载pdo_mysql扩展;执行new PDO('mysql:...')时,PHP只查已注册驱动列表,无mysql则立即报错,与数据库状态无关。

直接结论:不是代码写错了,是 PHP 运行时没加载 pdo_mysql(或其他对应驱动)扩展。 你执行 new PDO('mysql:host=...') 时,PHP 会去查已加载的驱动列表里有没有叫 mysql 的——没有就报这个错,不看数据库是否启动、密码对不对、端口通不通。
怎么确认到底缺哪个驱动
别猜,先看 PHP 实际加载了什么。创建一个 check.php:
<?php print_r(PDO::getAvailableDrivers()); ?>
命令行运行:php check.php。输出类似:
Array
(
[0] => sqlite
)
说明只有 sqlite 驱动可用,mysql 根本不在列表里。这时候再检查 DSN 或密码已经没意义了——PDO 连解析都不用解析,直接放弃。
立即学习“PHP免费学习笔记(深入)”;
- 如果输出为空数组,说明连
pdo主模块都没加载,优先检查extension=pdo是否启用 - 如果只有
sqlite,大概率是pdo_mysql没装或没启用 - 如果看到
mysql但还是报错,注意大小写:PDO 驱动名是小写的mysql,不是MySQL或MYSQL
Linux 下装驱动的常见命令差异
不同发行版安装包名不同,装错包等于白干。关键不是“装 PHP”,而是“装 PDO 对应的 MySQL 驱动”:
- Ubuntu/Debian:
sudo apt install php-mysql(该包同时提供pdo_mysql和mysqli) - CentOS/RHEL 8+:
sudo dnf install php-pdo php-mysqlnd(mysqlnd是现代推荐的 MySQL 原生驱动) - Alpine(Docker 常见):
apk add php82-pdo_mysql(注意版本号要和你用的 PHP 版本一致,比如php83-pdo_mysql) - 不要只装
php-mysqli或php-mysql而漏掉pdo——有些旧包拆得细,pdo是单独的
Windows / XAMPP 环境启用扩展的硬坑
Windows 下不是装完就完事,必须手动改配置并确保生效路径正确:
- 找到真实生效的
php.ini:在 Web 页面跑phpinfo(),看 “Loaded Configuration File” 行的路径 - 编辑该文件,取消注释这两行(注意 Windows 是
.dll后缀):extension=php_pdo.dllextension=php_pdo_mysql.dll - 别改错文件:XAMPP 里有多个
php.ini(CLI 用一个,Apache/FPM 用另一个),Web 请求走的是 Apache 或 Nginx 加载的那个 - 改完必须重启 Web 服务(不是重启电脑,也不是只重启 PHP-FPM);Apache 要
httpd -k restart,Nginx + PHP-FPM 要分别重启两个进程
为什么 php -m 显示 pdo_mysql,但网页还是报错
这是最隐蔽也最常被忽略的情况:CLI 和 Web SAPI 加载的 PHP 配置不一致。
- 终端执行
php -m | grep pdo,看到pdo和pdo_mysql—— 这只是 CLI 模式下的结果 - Web 请求走的是 Apache mod_php 或 PHP-FPM,它们可能用的是另一套
php.ini,甚至另一个 PHP 安装路径 - 验证方法:在 PHP 页面里写
var_dump(phpinfo()),搜索 “Configuration File (php.ini) Path” 和 “Scan this dir for additional .ini files”,确认扩展是否真从这里加载 - Docker 用户特别注意:镜像里
docker-php-ext-enable pdo_mysql必须在构建阶段执行,不能靠挂载 ini 文件临时启用
驱动没加载这事,不看运行时实际环境,只凭“我本地能跑”或“我装过了”来判断,十次有九次会绕远路。



















