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

如何显示mysqli_query错误?查询失败仅返回空白页问题求助

问题

我尝试在PHP脚本中显示mysqli_error,当查询成功时能正常返回响应,但查询失败时仅显示空白页,使用mysqli_error($conn)和mysqli_errno($conn)均无效果。

数据库连接脚本(conn.php):

<?php
$ser = "test";
$user = "test";
$pass = "test";
$db="test";
$conn = mysqli_connect($ser, $user, $pass, $db);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
  }
?>

PHP查询脚本:

<?php
include 'conn.php';
if ($conn) {
    $sql = "INSERT INTO tbl_users (userId, email, pass) VALUES ('$userId', '$email', '$pass')";
    if (mysqli_query($conn, $sql)) {
        echo json_encode(array(
            "status" => "Ok",
            "message" => "Success",
        ));
    } else {
        echo json_encode(array(
            "status" => "Error",
            "message" => mysqli_error($conn),
        ));
    }
}
?>

开启ini_set('display_errors', 1)会显示完整错误页,但我只需要获取mysqli_error或mysqli_errno信息。


解决方案

1. 修复未定义变量导致的致命错误

查询脚本中直接使用的$userId、$email、$pass三个变量未被定义或赋值,PHP会抛出未定义变量的致命错误,直接终止脚本执行,根本无法进入mysqli_error分支,因此页面空白。

解决步骤:

  • 先通过请求参数(如$_POST/$_GET)获取变量并做基础校验:
<?php
include 'conn.php';
// 从POST请求获取变量,为空时设为默认空字符串
$userId = $_POST['userId'] ?? '';
$email = $_POST['email'] ?? '';
$pass = $_POST['pass'] ?? '';

// 基础非空校验
if (empty($userId) || empty($email) || empty($pass)) {
    echo json_encode(array(
        "status" => "Error",
        "message" => "缺少必要参数"
    ));
    exit;
}

if ($conn) {
    $sql = "INSERT INTO tbl_users (userId, email, pass) VALUES ('$userId', '$email', '$pass')";
    if (mysqli_query($conn, $sql)) {
        echo json_encode(array(
            "status" => "Ok",
            "message" => "Success",
        ));
    } else {
        echo json_encode(array(
            "status" => "Error",
            "message" => mysqli_error($conn),
        ));
    }
}
?>

2. 配置错误日志而非页面显示

如果不想在页面展示完整错误,但需要排查问题,可开启PHP错误日志并关闭页面错误输出:

<?php
// 开启错误日志(路径根据服务器配置调整)
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_errors.log');
// 关闭页面错误显示
ini_set('display_errors', 0);

include 'conn.php';
// 后续业务代码...
?>

脚本出错时,错误信息会写入指定日志文件,页面保持干净,同时你可以通过日志定位问题。

3. 替换SQL拼接为预处理语句(安全优化)

直接拼接变量到SQL语句存在严重SQL注入风险,建议使用预处理语句,此时错误信息需通过mysqli_stmt_error($stmt)获取:

<?php
include 'conn.php';
$userId = $_POST['userId'] ?? '';
$email = $_POST['email'] ?? '';
$pass = $_POST['pass'] ?? '';

if (empty($userId) || empty($email) || empty($pass)) {
    echo json_encode(array("status" => "Error", "message" => "缺少必要参数"));
    exit;
}

if ($conn) {
    // 初始化预处理语句
    $stmt = mysqli_prepare($conn, "INSERT INTO tbl_users (userId, email, pass) VALUES (?, ?, ?)");
    // 绑定参数("sss"表示三个字符串类型参数)
    mysqli_stmt_bind_param($stmt, "sss", $userId, $email, $pass);
    
    if (mysqli_stmt_execute($stmt)) {
        echo json_encode(array("status" => "Ok", "message" => "Success"));
    } else {
        // 获取预处理语句的错误信息
        echo json_encode(array("status" => "Error", "message" => mysqli_stmt_error($stmt)));
    }
    mysqli_stmt_close($stmt);
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:33:31