php 8.5.7 已彻底移除 mysql_connect(),必须改用 pdo;需启用 pdo_mysql 扩展、正确配置 dsn(含 charset)、设置异常模式、处理 mysql 8.0+ 认证插件兼容性,并验证连接有效性。

PHP 8.5.7 已彻底移除 mysql_connect(),直接报错是必然的——它早在 PHP 7.0 就被删了,现在连废弃提示都不会给。换成 PDO 不是“改一行代码”那么简单,得配好驱动、写对 DSN、设好错误模式,否则照样连不上或静默失败。
确认 PDO_MySQL 扩展已启用
这是前提,没启用就根本走不到连接逻辑:
- 运行
php -m | grep pdo,确保输出含pdo_mysql(不是只有pdo) - 若无,编辑
php.ini,取消注释或添加:
extension=pdo_mysql - 重启 Web 服务(如 Apache/Nginx)或 PHP-FPM,再用
phpinfo()页面搜索 “PDO MySQL” 确认已加载
把 mysql_connect 改成 PDO 构造函数
旧写法(会直接 fatal error):
$link = mysql_connect('localhost', 'user', 'pass');
新写法(注意四点关键):
-
DSN 必须带 charset:写成
mysql:host=localhost;dbname=test;charset=utf8mb4,不能靠后面exec("SET NAMES")补,有竞态风险 -
必须开启异常模式:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则连接失败不报错,只返回 false,难排查 - 用户名密码传参位置固定:第2、3参数是账号密码,第4参数是选项数组,别颠倒
- 示例完整代码:
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, 'username', 'password', $options);
处理 MySQL 8.0+ 的认证插件兼容问题
如果你换的是 MySQL 8.0 或更新版本(比如 phpStudy 默认装的 8.0),旧密码可能用的是 mysql_native_password,而新版默认用 caching_sha2_password,PDO 连接会直接报 Access denied:
- 登录 MySQL 命令行,执行:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 然后
FLUSH PRIVILEGES; - 或者在创建用户时显式指定:
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123';
验证连接是否真正生效
光 new PDO 成功不代表数据库服务就通了,还得测响应:
- 加一句轻量查询:
$pdo->query("SELECT 1")->fetchColumn(); - 如果这步报错,说明 MySQL 服务没起来、端口被占、防火墙拦了,或用户权限不足(检查 host 是否匹配,比如
'user'@'127.0.0.1'和'user'@'localhost'是不同账号) - 常见错误对照:
“Connection refused” → MySQL 没运行或端口错;
“Access denied” → 用户/密码/主机/IP 权限不对;
“Unknown database” → dbname 写错或库不存在
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











