php 8.0已移除mysql_*函数,ci3需将$db'default'设为'mysqli'并启用php mysqli扩展,同时mysql 8.0用户须执行alter user...identified with mysql_native_password修复认证协议兼容性。

PHP 8.0 已彻底移除 mysql_* 函数(如 mysql_connect),而 CodeIgniter 3 默认的 'dbdriver' => 'mysql' 正是依赖这一废弃扩展。所以当你在 PHP 8.0 环境中运行 CI3 并看到类似 "Call to undefined function mysql_connect()" 的致命错误,说明框架仍在尝试加载已不存在的旧驱动。
解决方式不是“修复 mysql 驱动”,而是强制切换到 mysqli 驱动并确保环境就绪。以下是具体操作:
确认并切换数据库驱动为 mysqli
打开 application/config/database.php,找到 $db['default'] 数组,确保以下两项明确设置:
-
'dbdriver' => 'mysqli'(不能是'mysql',也不能留空或注释) -
'db_debug' => TRUE(便于暴露真实错误,调试阶段必开)
检查 PHP 是否启用 mysqli 扩展
在终端执行:
php -m | grep -i mysqli
若无输出,说明扩展未启用。根据你的 PHP 安装方式处理:
- Ubuntu/Debian:
sudo apt install php-mysqli→sudo systemctl restart php8.0-fpm nginx - CentOS/RHEL:
sudo yum install php-mysqlnd或php-mysqli→ 重启 Web 服务 - Windows:检查
php.ini中extension=mysqli或extension=php_mysqli.dll是否取消注释
验证 MySQL 连接参数兼容性(尤其 MySQL 8.0+)
即使驱动改对,PHP 8.0 + MySQL 8.0 组合仍可能因认证协议报错:
The server requested authentication method unknown to the client
这是因为 MySQL 8.0 默认用 caching_sha2_password,而部分旧版 mysqli 客户端不支持。解决方法是在 MySQL 中重置用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
然后在 CI3 配置中使用该账号——这是最稳妥的兼容方案。
额外注意点
- 不要混用驱动名:CI3 的
'dbdriver'只接受'mysqli'或'pdo'(PDO 需额外配置 DSN,CI3 原生支持较弱,不推荐新手用) - 检查
hostname:Linux 生产环境避免写'localhost',改用'127.0.0.1',防止 Unix socket 路径问题 - 清理缓存:CI3 本身无配置缓存,但若你用了 OPcache 或 APCu,可临时重启 PHP-FPM 确保新配置生效
迁移完成之后,所有数据库操作($this->db->query()、insert() 等)会自动走 mysqli 接口,无需修改业务代码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











