根据条件为$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
相关产品推荐
相关产品推荐

