mysqli_query()失败后需先判断返回值是否为false,再调用mysqli_errno($conn)获取数字错误码(如1062);面向对象中用$mysqli->errno,不可混淆$mysqli->connect_errno。

mysqli_query()失败后怎么拿到错误码
直接调用 mysqli_query() 后不检查返回值,就等于主动放弃错误诊断能力。它执行失败时只返回 false,不会自动抛异常,错误码必须手动提取。
关键动作是:先判断返回值是否为 false,再立刻调用 mysqli_errno($conn) —— 它返回的是纯数字(如 1062),不是字符串。
-
mysqli_errno($conn)必须传入有效的连接资源,否则返回0(即“无错误”),但实际是调用失败 - 同一连接上,
mysqli_errno()总是返回「最近一次操作」的错误码,中间穿插其他 mysqli 调用会覆盖它 - 不要在
if ($result === false)之前做任何其他 mysqli 操作(比如mysqli_affected_rows()),否则错误码可能被冲掉
面向对象写法中该用 $mysqli->errno 还是 $mysqli->connect_errno
$mysqli->errno 是查「最近一次查询或命令」的错误码;$mysqli->connect_errno 只管连接阶段的错误(比如用户名错、端口不通),两者完全不重叠。
常见误用:在 $mysqli->query() 失败后去读 $mysqli->connect_errno,结果永远是 0 —— 因为连接早就成功了,问题出在 SQL 执行环节。
- 查 SQL 执行错误,只用
$mysqli->errno或$mysqli->error - 查连接失败,只用
$mysqli->connect_errno和$mysqli->connect_error - 如果连接本身失败,
$mysqli实例可能根本没创建成功,此时访问->errno会触发 PHP Notice
为什么有时 mysqli_errno() 返回 0 却实际执行失败
最常见原因是启用了 MYSQLI_REPORT_STRICT 模式(例如通过 mysqli_report(MYSQLI_REPORT_STRICT) 全局设置,或某些框架默认开启)。这时 mysqli_query() 不再返回 false,而是直接抛出 mysqli_sql_exception 异常,mysqli_errno() 根本没机会被调用。
- 这种模式下,
if (!$result)判断完全失效,代码会直接中断在query()行 - 若想继续用
mysqli_errno(),得先关闭严格模式:mysqli_report(MYSQLI_REPORT_OFF) - 更推荐做法:统一用 try-catch 捕获
mysqli_sql_exception,然后从异常对象里取$e->getCode()(对应错误码)和$e->getMessage()
错误码 1062(唯一键冲突)怎么安全识别和处理
不能只靠 mysqli_error() 字符串匹配(比如检查是否含 "Duplicate entry"),因为不同 MySQL 版本或语言环境返回的提示文本可能变化。唯一稳定方式是比对数字错误码。
- 插入失败后立即检查
$mysqli->errno === 1062,这是官方定义的 ER_DUP_ENTRY 错误码 - 注意:1062 仅表示「违反唯一约束」,不区分是主键、UNIQUE 索引还是其他约束,业务逻辑需自行判断上下文
- 如果同时要记录日志,建议同时保存
$mysqli->sqlstate(如'23000'),它比数字码更标准化,也便于跨数据库兼容
mysqli_errno() 返回的只是一个整数。真正定位问题,还得结合 $mysqli->error 的文本描述、原始 SQL 语句、以及执行前后的数据状态。


















