mysqli_connect()报warning主因是mysql服务未运行、mysqli扩展未启用或root用户缺少@'127.0.0.1'权限,按此顺序排查可快速定位。

phpEnv 里 mysqli_connect() 报 Warning,基本不是代码问题,而是 MySQL 服务没配通、扩展没加载,或用户权限卡在了连接层。三类情况占 95% 以上,按顺序排查就能快速定位。
mysqli 扩展未启用导致 Class "mysqli" not found
这是最底层的失败:PHP 根本不认识 mysqli 类。错误日志里会明确出现 Fatal error: Class "mysqli" not found。
- 检查 php.ini:找到 phpEnv 安装目录下的
php\php.ini(路径类似phpEnv\php\php.ini),确认extension=mysqli这行前面没有分号;如果用的是 PHP 8+,还要检查extension=mysqlind是否也已启用 - 重启生效:改完
php.ini后,必须重启 phpEnv 主程序(不是只点「重载配置」),否则改动不生效 - 验证命令:在 phpEnv 的「PHP Info」页面或运行
php -m | findstr mysqli(Windows)/php -m | grep mysqli(Linux/macOS 模拟环境)确认扩展已列出
MySQL 服务未运行或监听异常导致 Connection refused
mysqli_connect(): (HY000/2002): Connection refused 表示 PHP 尝试连 3306 端口时被直接拒绝——MySQL 进程根本没在听,或绑错了地址。
- 先看服务状态:打开 phpEnv 控制面板,确认 MySQL 显示「运行中」;若为灰色或「停止」,点「启动 MySQL」;别信 Windows 服务列表里的 MySQL 项,phpEnv 自带的 MySQL 是独立进程
- 检查 my.ini 绑定:编辑
phpEnv\mysql\my.ini,确认bind-address被注释(即形如#bind-address = 127.0.0.1),且skip-networking这行不存在或已被注释 - 端口冲突验证:在命令行执行
netstat -ano | findstr :3306(Windows)或lsof -i :3306(macOS/Linux),看是否真有 mysqld 进程在监听;若无,说明服务没起来或配置崩了
root 用户无 @'127.0.0.1' 权限导致 Access denied
即使 MySQL 在跑、扩展已启,mysqli_connect('127.0.0.1', 'root', ...) 仍可能报 Access denied for user 'root'@'127.0.0.1'——因为 phpEnv 默认只建了 'root'@'localhost',而 Navicat 和多数 PHP TCP 连接走的是 127.0.0.1,不是 localhost。
- 进 MySQL CLI(用 phpEnv 自带的「MySQL CLI」按钮)执行授权:
GRANT ALL ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES; - 不要只授权
@'%':MySQL 8+ 对@'%'默认用caching_sha2_password,老版 PHP(如 7.3 及以下)不认,会转成更隐蔽的认证失败 - 测试连接用 IP,不用 localhost:PHP 代码里
$host填'127.0.0.1',别填'localhost';Windows 下localhost可能走命名管道,和 phpEnv 的 TCP 模式不兼容
真正容易被忽略的是:phpEnv 的 MySQL 配置、用户授权、PHP 扩展三者必须全部就位,且顺序不能乱——先确保服务跑起来,再改配置并重启服务,最后进数据库加权限,缺一不可。任何一步跳过或顺序颠倒,都会让 Warning 看似随机实则必然。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











