mysqli连接失败主因是扩展未启用、MySQL服务未运行或连接参数错误;须依次检查mysqli模块、MySQL进程及host配置,并依据mysqli_connect_error()提示定位问题。
mysql
i_connect() 连接失败的常见原因和排查顺序
连接直接报错或返回
,不是密码错了就是扩展没开,别急着改代码。先确认三件事:
扩展是否启用:运行
或查
页面里有没有
模块
MySQL 服务是否在运行:
(Linux)或任务管理器里看
进程
连接参数是否写错:特别是
写成
却没开 MySQL 的
,会导致超时;用
则走 socket,
才走 TCP
错误信息本身也藏线索:
返回的字符串里如果含
,说明端口不通;含
,说明账号/密码/权限不对;含
,说明 DNS 解析失败或主机名拼错。
mysqli 面向对象方式必须做的两件事:字符集和错误检查
只写
就开始查数据,大概率乱码或静默失败。必须紧接着做:
调用
—— 不是
,后者不支持 emoji 和部分汉字,PHP 会默默接受但存不进字段
检查
—— 不要等
报错才处理,连接失败时
对象虽存在,但后续所有方法都返回
或触发警告
示例片段:
立即学习
“
PHP免费学习笔记(深入)
”;
mysqli_query() 返回 false 时,怎么定位具体哪条 SQL 出了问题
返回
,不代表语句语法错,可能是表不存在、字段名错、权限不足、甚至磁盘满。关键不是重试,而是立刻查错误源:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
用
获取最近一次查询的错误描述,比
更准(后者依赖全局状态)
用
获取错误码,比如
是表不存在,
是未知列,
是权限拒绝
注意:
失败返回
,但空结果集(0 行)返回的是有效
对象,别混淆
调试建议:把出问题的 SQL 单独复制到 MySQL 客户端里执行,看原生报错——很多问题(如 GROUP BY 严格模式、ONLY_FULL_GROUP_BY)在 PHP 里只报模糊错误,命令行里才显示完整提示。
预处理语句 bind_param() 类型符写错却不报错?这是真的
的第一个参数是类型字符串,
(string)、
(integer)、
(double)、
(blob)。写错类型不会抛异常,但会导致绑定失败、值被截断或 SQL 执行出错,且错误信息里完全不提类型问题。
传整数却用
:PHP 会转成字符串再传给 MySQL,可能触发隐式类型转换,WHERE 条件失效
传字符串却用
:PHP 强转为 int,
变成
,
变成
参数个数不匹配:类型字符串长度 ≠ 后续变量个数,
直接返回
,但容易被忽略
安全做法:类型符严格对应变量实际类型,调试期加一行
确认;生产环境避免动态拼类型符,宁可拆成多个 prepare 调用。
字符集、错误检查、SQL 错误定位、类型符匹配——这四点漏掉任意一个,都会让 mysqli 表现得“有时行有时不行”,而问题往往不出在逻辑,出在连接初始化和参数绑定这些看似简单的环节。
falsemysqliphp -m | grep mysqliphpinfo()mysqlisystemctl status mysqlmysqld$host127.0.0.1skip-name-resolvelocalhost127.0.0.1mysqli_connect_error()Connection refusedAccess deniedUnknown MySQL server host$mysqli = new mysqli(...)$mysqli->set_charset('utf8mb4')utf8$mysqli->connect_errorquery()$mysqlinull$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
if ($mysqli->connect_error) {
die('Connect failed: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4'); // 必须在 query 前执行
mysqli_query()false$mysqli->errormysqli_error($mysqli)$mysqli->errno114610541045SELECTfalsemysqli_resultbind_param()sidb's''i'"123abc"123"abc"0bind_param()falsevar_dump(gettype($var))