需先确认phpEnv中mysqli扩展是否启用:打开D:\phpEnv\php\php.ini,取消;extension=mysqli注释,检查extension_dir路径正确,重启服务后访问phpinfo()验证是否有mysqli区块;再检查MySQL服务运行、host用127.0.0.1而非localhost、root密码为空或为root、端口默认3306,并用$mysqli->connect_error和$mysqli->set_charset('utf8mb4')确保连接有效且字符集正确。

phpEnv 是 Windows 下的 PHP 集成环境(类似 XAMPP、WAMP),它默认不启用 mysqli 扩展,直接调用 mysqli_connect() 或 new mysqli() 会报错:「Call to undefined function mysqli_connect()」。必须手动开启扩展并验证连接参数,否则连第一步都走不通。
怎么确认 phpEnv 是否已加载 mysqli 扩展
phpEnv 的配置文件路径通常为 php\php.ini(在 phpEnv 安装目录下,比如 D:\phpEnv\php\php.ini)。不要依赖“看起来像开启了”的直觉——得实锤。
- 用文本编辑器打开该
php.ini,搜索;extension=mysqli或;extension=php_mysqli.dll - 若存在且被分号注释,删掉开头的
;,改为extension=mysqli(PHP 7.4+ 推荐写法)或extension=php_mysqli.dll(旧版兼容写法) - 同时检查
extension_dir是否指向正确的扩展目录,例如:extension_dir = "D:/phpEnv/php/ext"—— 路径错误会导致扩展加载失败但无明显提示 - 保存后,必须重启 phpEnv 的 Apache/Nginx 服务(通过 phpEnv 控制面板点「Restart」),不是只刷新网页
- 新建一个
info.php,内容为<?php phpinfo(); ?>,访问后搜索页面是否有「mysqli」区块,且「Client API library version」有数值
mysqli_connect() 连接失败的常见原因和对应检查项
即使扩展开了,mysqli_connect() 仍可能返回 false 或报错「Connection refused」、「Access denied」。这不是代码写错了,而是环境链路上某环断了。
-
mysqli_connect()第一个参数是主机名,phpEnv 默认 MySQL 绑定在127.0.0.1,但很多人填localhost—— 在 Windows 下这两者行为可能不同(localhost可能走命名管道,而 phpEnv 的 MySQL 通常只监听 TCP 端口),建议统一用127.0.0.1 - 确认 MySQL 服务确实在运行:打开 phpEnv 面板,看 MySQL 行状态是否为「Running」;或者命令行执行
netstat -ano | findstr :3306,有输出才说明端口被监听 - phpEnv 自带的 MySQL 默认用户是
root,密码为空,但部分版本初始化后密码被设为root或随机值 —— 查看 phpEnv 安装目录下的mysql\my.ini或控制台初始化日志 - 如果用的是非默认端口(比如 3307),
mysqli_connect()必须显式传入第五个参数:mysqli_connect('127.0.0.1', 'root', '', 'testdb', 3307)
面向对象方式 new mysqli() 必须做的两件事
比起面向过程写法,new mysqli() 更常用也更清晰,但它不会自动抛异常,出错时对象仍被创建,只是属性出问题 —— 很多人卡在这一步却以为“代码没报错就是连上了”。
立即学习“PHP免费学习笔记(深入)”;
- 必须检查
$mysqli->connect_error是否为非空字符串,不能只靠if ($mysqli)判断(对象永远是 truthy) - 连接成功后立刻调用
$mysqli->set_charset('utf8mb4'),否则中文、emoji 插入/查询会乱码 —— phpEnv 的 MySQL 默认字符集通常是latin1,不设就踩坑 - 示例片段:
$mysqli = new mysqli('127.0.0.1', 'root', '', 'testdb'); if ($mysqli->connect_error) { die('连接失败: ' . $mysqli->connect_error); } $mysqli->set_charset('utf8mb4');
持久化连接在 phpEnv 中不推荐直接用
phpEnv 是本地开发环境,请求量低、生命周期短,开持久化连接(即主机名前加 p:,如 'p:127.0.0.1')反而容易引发状态残留问题,比如事务未提交、临时表未删、锁未释放 —— 这些在 phpEnv 的 MySQL 中不会自动清理,下次请求复用连接时直接报错。
- 除非你明确知道自己的代码每次都会
rollback、drop temporary table、unlock tables,否则别碰p:前缀 - phpEnv 的 MySQL 默认没有开启
wait_timeout或interactive_timeout的长连接支持,持久化连接可能被服务端主动断开,导致 PHP 报「MySQL server has gone away」 - 真正需要性能优化时,优先考虑连接池或应用层缓存,而不是在本地开发环境强行上持久化
最常被忽略的一点:phpEnv 的 MySQL 配置(my.ini)里 bind-address 默认是 127.0.0.1,这没问题;但如果改过,又没同步更新 PHP 连接里的 host,就会静默失败。连不上时,先盯死这个地址是否一致,比反复检查密码有用得多。



















