You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mysqli连接自定义错误信息无法显示,求原因解析

自定义MySQLi连接错误信息不显示的原因解析

你的代码如下:

<?php

require_once "connect.php";

$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);

if ($polaczenie->connect_errno != 0) {
    echo "Error: " . $polaczenie->connect_errno;
} else {
    $login = $_POST['login'];
    $haslo = $_POST['haslo'];

    echo "It works!";

    $polaczenie->close();
}

?>

核心问题点

  • 错误抑制符@的反向影响:你用@屏蔽了new mysqli()的连接错误,但如果connect.php未正确加载(比如文件路径错误、文件不存在),或者文件内的$host/$db_user等配置变量未定义,require_once会直接抛出致命错误,代码根本走不到自定义错误的判断逻辑,直接显示系统默认错误。
  • 连接失败后的变量类型错误:当new mysqli()连接失败且被@抑制时,$polaczenie会返回false而非mysqli对象,这时候调用$polaczenie->connect_errno会触发「调用非对象的成员方法」的致命错误,代码直接中断,自定义错误自然无法输出。

修复方案

  1. 移除错误抑制符@:不要屏蔽初始错误,先排查基础问题(比如connect.php是否存在、配置变量是否正确)。
  2. 先验证连接对象有效性:在判断connect_errno前,先检查$polaczenie是否为有效对象。
  3. 可选:启用mysqli异常模式:用异常处理替代手动判断,错误逻辑更清晰。

修改后的示例代码

<?php
// 先检查connect.php是否存在,避免致命错误
if (!file_exists("connect.php")) {
    die("Error: 无法找到connect.php文件");
}
require_once "connect.php";

// 检查必要配置变量是否存在
if (!isset($host, $db_user, $db_password, $db_name)) {
    die("Error: connect.php中缺少必要的数据库配置变量");
}

// 移除@,启用mysqli异常模式
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
    echo "It works!";
    $polaczenie->close();
} catch (mysqli_sql_exception $e) {
    echo "Error: " . $e->getCode(); // 输出错误码,也可使用$e->getMessage()获取详细错误信息
}
?>

内容的提问来源于stack exchange,提问作者Szymon Olkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:15:11