PHP查询返回NULL但数据实际存在,mysqli_fetch_array错误排查
问题根因
你现在返回NULL的核心原因是SQL语句中对$prud的拼接额外加了前后空格,导致查询条件匹配失败:
$priceSql = "SELECT saleprice from products where id = ' $prud ' "; // 这里$prud前后多了空格,比如传入id是123,实际查询的是 id = ' 123 '
你的id字段是int类型,数据库执行查询时会把带空格的字符串转为数字,部分场景下转换后的数值和实际id不匹配,就会查不到数据,mysqli_query返回空结果集,mysqli_fetch_array读取空结果集就会返回NULL,最终push到数组里就是NULL值。
其他潜在问题
- 没有做SQL错误校验:如果SQL执行出错(比如数据库连接断开、表不存在),
mysqli_query会返回布尔值false,传入mysqli_fetch_array也会返回NULL,你没有对查询结果做合法性判断 - 存在严重SQL注入风险:直接拼接用户传入的
$_POST参数到SQL语句中,极易被注入攻击,必须使用预处理语句传参 - 多余的引号包裹:
id是数值类型,查询条件不需要用单引号包裹
修复后的代码示例
$selected_items_values = $_POST['product_id']; $prices = []; // 先创建预处理语句,避免注入,同时性能更好 $stmt = mysqli_prepare($db, "SELECT saleprice FROM products WHERE id = ?"); // 绑定参数,i代表传入的是int类型 mysqli_stmt_bind_param($stmt, "i", $prud); foreach($selected_items_values as $prud) { if(isset($prud) && is_numeric($prud)) { // 执行查询 mysqli_stmt_execute($stmt); // 绑定结果变量 mysqli_stmt_bind_result($stmt, $saleprice); // 读取结果 if(mysqli_stmt_fetch($stmt)) { array_push($prices, $saleprice); } } } var_dump($prices);
验证方法
如果修改后还是有问题,可以先打印实际执行的SQL语句确认参数是否正确:
// 原来的代码里加一行打印SQL,看拼接出来的语句是不是正确的 echo $priceSql;
直接把打印出来的SQL放到数据库客户端执行,就能确认是不是查询条件的问题。
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

