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

根据条件为$query变量分配数据库查询结果时出现Null值错误的技术咨询

问题原因分析

你遇到的"null is provided"错误,核心原因是当$formtype的值既不是"patient"也不是"donor"时,$query会保持初始的NULL状态,后续调用mysqli_fetch_array($query)时传入了空值,自然触发错误。

另外还有两个隐藏问题必须重视:

  • 你的SQL语句直接拼接$id参数,存在严重的SQL注入风险,这是生产环境绝对不能忽略的安全漏洞。
  • 即使进入了if/else if分支,mysqli_query也可能执行失败(比如数据库连接异常、表不存在等),此时$query会是false,同样会导致mysqli_fetch_array报错。

解决方案

1. 先处理$formtype的默认分支

确保无论$formtype是什么值,$query都不会是NULL。可以添加else分支提示无效参数,或者返回空结果:

$query = NULL;
if($formtype == "patient"){
    $query = mysqli_query($conn,"SELECT * FROM patient where email='$id'")or die(mysqli_error($conn));
} else if($formtype == "donor"){
    $query = mysqli_query($conn,"SELECT * FROM donor where email='$id'")or die(mysqli_error($conn));
} else {
    // 处理无效的formtype,比如抛出提示
    die("无效的表单类型");
    // 或者如果想返回空结果,可初始化一个空结果集
    // $query = mysqli_query($conn, "SELECT 1 WHERE 0");
}

// 先检查$query是否有效,再执行fetch
if($query && mysqli_num_rows($query) > 0){
    $row = mysqli_fetch_array($query);
} else {
    $row = []; // 或自定义无数据的处理逻辑
}

2. 修复SQL注入问题(强烈推荐)

使用MySQLi预处理语句,彻底避免参数拼接带来的安全风险:

$query = NULL;
$stmt = null;

if($formtype == "patient"){
    $stmt = mysqli_prepare($conn, "SELECT * FROM patient where email = ?");
} else if($formtype == "donor"){
    $stmt = mysqli_prepare($conn, "SELECT * FROM donor where email = ?");
} else {
    die("无效的表单类型");
}

// 绑定参数并执行查询
mysqli_stmt_bind_param($stmt, "s", $id);
mysqli_stmt_execute($stmt);
$query = mysqli_stmt_get_result($stmt);

// 安全获取结果
if($query && mysqli_num_rows($query) > 0){
    $row = mysqli_fetch_array($query);
} else {
    $row = [];
}

// 关闭预处理语句
mysqli_stmt_close($stmt);

额外提示

  • 调用mysqli_error()时最好传入连接对象$conn,这样能更精准获取数据库错误信息。
  • 生产环境不要使用die(mysqli_error()),应该用日志记录错误,避免泄露数据库敏感信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:23:12