答案是pdo_mysql扩展未启用导致pdo连接失败:需用php -m | grep pdo确认cli环境已加载pdo和pdo_mysql,再通过phpinfo()核对web环境的php.ini路径及extension=pdo_mysql是否启用,二者必须一致且驱动名严格为'mysql'。

pdo_mysql 扩展没启用,PDO 类直接报错
运行 new PDO() 时抛出 Class 'PDO' not found 或 Driver not found: mysql,说明 PHP 根本没加载数据库驱动。这不是配置问题,是环境缺失。
- 执行
php -m | grep -i pdo,确认输出里有pdo和pdo_mysql;缺哪个就装哪个 - Ubuntu/Debian:运行
sudo apt install php-mysql(PHP 版本自动匹配),然后重启php-fpm或 Apache - Alpine(Docker):需明确版本,如
apk add php82-pdo_mysql,否则扩展不生效 - 检查
php.ini是否禁用了扩展:确认extension=pdo和extension=pdo_mysql未被注释,且路径正确(尤其 Windows 下可能写成php_pdo_mysql.dll)
mysqli_connect() 报 Connection refused 怎么快速定位
这个错误不是密码错,而是 TCP 层连不上——要么服务没起来,要么 host/port 不对,要么被拦了。
- 先绕过 PHP,用命令行直连:
mysql -h 127.0.0.1 -P 3306 -u root -p;能通,说明服务和账号没问题;不通,再查服务状态 - 查 MySQL 是否监听 TCP:
netstat -tuln | grep :3306;如果只看到127.0.0.1:3306而不是*:3306,说明 bind-address 限制了访问范围 - Docker 环境别写
localhost或127.0.0.1—— 容器内这两个地址指向自己,不是宿主机;改用服务名(如mysql)或host.docker.internal - 云服务器注意安全组:3306 端口必须放行,且 MySQL 用户的
Host字段得是%或具体公网 IP,不能是localhost
ThinkPHP/Laravel 读不到 .env 里的 DB_HOST
框架显示“连接失败”,但你确信 .env 写对了——大概率是环境变量根本没加载进来。
-
.env必须放在项目根目录(和artisan或think命令同级),不是config/下 -
APP_DEBUG=true必须开启,否则 Laravel/ThinkPHP 会跳过.env加载逻辑 - 键名必须全大写+下划线:
DB_HOST=127.0.0.1有效,db_host或Db_Host都无效 - 临时验证:在控制器里加一行
dump(env('DB_HOST'));输出null就说明上面任一条件没满足 - 密码含
@、/、:等字符?Laravel 的 DSN 解析会截断——必须 URL 编码后填入,例如pass@word→pass%40word
MySQL 8.0+ 连接失败但没报错,只有白屏或超时
这是最隐蔽的问题:MySQL 8.0 默认用 caching_sha2_password 认证插件,而老版 PHP(尤其是 PHP
- 登录 MySQL 执行:
SELECT Host, User, plugin FROM mysql.user WHERE User = 'your_user'; - 如果
plugin是caching_sha2_password,执行:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - Laravel 10+/ThinkPHP 6+ 要求 PHP ≥ 8.1,若用 PHP 7.4 连 MySQL 8.0+,即使插件改了,也可能因底层驱动兼容性出问题
- 连接池耗尽也会表现类似:检查
max_connections是否被占满,框架是否在循环里反复new PDO()却没释放
php -m 有扩展,再用 mysql -h 直连验证服务与权限,最后才动框架配置。很多“连不上”其实卡在前两步,代码反而是最不容易出错的部分。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











