mysqli扩展需手动启用,localhost连接失败多因socket/tcp混淆,参数顺序易错,mysql 8.0+默认认证插件不兼容,须设字符集并查错误日志定位问题。

mysqli 扩展没启用,连接直接报错
PHP 7.2 默认不自动启用 mysqli,哪怕你装了 MySQL 服务,new mysqli() 也会提示 “Class 'mysqli' not found” 或 “Call to undefined function mysqli_connect()”。必须手动打开扩展。
- 运行
php --ini查出php.ini实际路径(不是你猜的 /etc/php/7.2/apache2/php.ini,得看输出) - 编辑该文件,搜索
;extension=mysqli,删掉前面的分号 → 改成extension=mysqli - 如果用 Apache,重启服务:
sudo systemctl restart apache2(Ubuntu)或 XAMPP 控制面板点 Restart;如果是 PHP 内置服务器,关掉再重开 - 建个
info.php写<?php phpinfo(); ?>,浏览器访问后搜mysqli,看到 “enabled” 才算成功
localhost 和 127.0.0.1 连不上,其实是 socket vs TCP 问题
MySQL 在本地默认监听 socket 文件(如 /var/run/mysqld/mysqld.sock),而 localhost 会强制走 socket;127.0.0.1 才走 TCP。PHP 的 mysqli 构造函数传 localhost 却连不上,十有八九是 socket 路径不对或权限问题。
- 开发时统一改用
127.0.0.1,避开 socket 争议 - 确认 MySQL 确实在监听 TCP:终端执行
mysqladmin variables -u root -p | grep bind,看到bind_address | *或127.0.0.1才行 - 如果 MySQL 配置了
skip-networking或bind-address = 127.0.0.1但没开 port,检查my.cnf里是否有port = 3306且未被注释
mysqli_connect() 和 new mysqli() 参数顺序容易搞混
面向过程的 mysqli_connect() 和面向对象的 new mysqli() 参数顺序不同,混用会连错库甚至静默失败。
-
mysqli_connect($host, $username, $password, $dbname, $port, $socket)——$dbname是第 4 个参数,可为空(只连服务不选库) -
new mysqli($host, $username, $password, $dbname, $port, $socket)—— 参数顺序一样,但构造失败时不会返回 false,而是抛出异常或设$mysqli->connect_error - 推荐用面向对象写法,因为能立刻调
$mysqli->set_charset('utf8mb4')避免中文乱码,且后续支持预处理更自然 - 别漏掉端口参数:如果 MySQL 改过默认 3306(比如 MAMP 用 8889),
new mysqli('127.0.0.1', 'root', '', '', 8889)第 5 位必须显式传
密码为空或 root 权限太高,MySQL 8.0+ 会拒绝连接
PHP 7.2 能跑,但如果你本地 MySQL 是 8.0 或更高版本(XAMPP/MAMP 新版默认),用 root + 空密码直连会失败,报错类似 Plugin caching_sha2_password could not be loaded 或 Access denied for user 'root'@'localhost'。
- 临时解法:用 MySQL 命令行登录后执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; FLUSH PRIVILEGES; - 长期建议:不要用 root 开发,建专用用户:
CREATE USER 'dev'@'127.0.0.1' IDENTIFIED BY 'p4ssw0rd'; GRANT ALL ON mydb.* TO 'dev'@'127.0.0.1'; - 注意 host 必须写
'127.0.0.1',而不是'localhost',否则权限不生效(MySQL 认为这是两个不同 host)
实际连接代码里最常被忽略的是字符集设置和错误上下文——$mysqli->connect_error 只告诉你“错了”,但不告诉你错在哪台机器、哪个端口、用了哪种认证插件。真出问题时,先 telnet 一下端口,再查 MySQL 错误日志,比反复改 PHP 代码快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











