如何显示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
相关产品推荐
相关产品推荐

