php 8.0 彻底移除 mysql_* 函数,仅支持 mysqli 和 pdo_mysql;需检查代码是否残留 mysql_connect 等调用,确认 php.ini 中 extension=mysqli 和 extension=pdo_mysql 已启用并重启服务,同时注意 mysql 8.0 caching_sha2_password 认证插件兼容性。

PHP 7.4 升级到 8.0 后“mysql 扩展失效”,本质不是扩展坏了,而是 PHP 8.0 彻底移除了早已废弃的 mysql_* 函数系列(如 mysql_connect),只保留并默认启用 mysqli 和 PDO_mysql。你看到的“连不上”“500 错误”或“Call to undefined function mysql_connect”都是这个原因。
确认是否真在用已删除的 mysql 扩展
先检查代码里有没有残留的 mysql_* 函数调用:
- 搜索项目中所有
mysql_connect(、mysql_query(、mysql_fetch_array(等——这些在 PHP 8.0 中已完全不存在,会直接报Fatal error - 运行
php -m | grep -i mysql,输出里应有mysqli和pdo_mysql,但绝不会有mysql - 打开
phpinfo()页面,确认 “Loaded Configuration File” 路径(如/etc/php/8.0/apache2/php.ini),再检查该配置中extension=mysqli和extension=pdo_mysql未被注释
把旧代码迁移到 mysqli 或 PDO
不能继续用 mysql_*,必须改写连接与查询逻辑。两种主流方式:
-
mysqli 面向对象写法(推荐):
$mysqli = new mysqli('127.0.0.1', 'user', 'pass', 'db');<br> if ($mysqli->connect_error) { die('连接失败: ' . $mysqli->connect_error); }<br> $result = $mysqli->query("SELECT * FROM users"); -
PDO 方式(更通用、支持预处理):
try {<br> $pdo = new PDO('mysql:host=127.0.0.1;dbname=db;charset=utf8mb4', 'user', 'pass');<br> $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br> $stmt = $pdo->query("SELECT * FROM users");<br> } catch (PDOException $e) { die('连接失败: ' . $e->getMessage()); }
注意 MySQL 8.0 认证插件兼容性
如果改完代码仍连不上,且报错含 caching_sha2_password 或 Authentication plugin cannot be loaded,说明 MySQL 8.0 默认认证方式不被当前 PHP 驱动完全支持:
- 临时解决:登录 MySQL 命令行,执行
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';<br> FLUSH PRIVILEGES;
- 长期建议:确保使用较新版本的 mysqlnd 驱动(PHP 8.0 默认自带),并在 PDO 连接串中加
;allowPublicKeyRetrieval=true,mysqli 则需启用MYSQLI_CLIENT_SSL_ALLOW_PUBLIC_KEY_RETRIEVAL
验证扩展是否真正加载
改完配置后必须重启服务,并双重验证:
- CLI 模式:
php -m | grep -E "(mysqli|pdo_mysql)"应显示两行 - Web 模式:访问
phpinfo()页面,搜索 “mysqli” 和 “pdo_mysql”,确认“Client API library version”非空,且“enabled”为 Yes - 若仍不显示,检查
php.ini中extension_dir路径是否正确(如/usr/lib/php/20200930/),对应目录下是否存在mysqli.so和pdo_mysql.so
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











