PHP导出数据库数据到CSV时出现num_rows读取布尔值错误
问题原因与解决方法
核心错误原因
你的SQL语句存在语法错误,导致mysqli_query执行失败,返回了布尔值false而非预期的结果集对象,因此调用$query->num_rows时触发了“Attempt to read property 'num_rows' on bool”错误。
具体错误点:SELECT字段列表最后一个字段stock.final_price as cost后面多了一个冗余逗号,这直接导致SQL解析失败。
修正后的代码
1. 修复SQL语句
$stmt = "SELECT FROM_UNIXTIME(`stock`.`created_at`, '%Y-%m-%d') as date, stock.pid, stock.name, stock.description, stock.price, stock.final_price as cost FROM `stock` WHERE stock.type = 'partbike' AND stock.store = 'TWN'";
2. 增加查询错误校验
为了快速定位后续可能出现的问题,建议在执行查询后先判断是否执行成功:
$query = mysqli_query($db, $stmt); // 先校验查询是否成功 if (!$query) { die('SQL执行错误: ' . mysqli_error($db)); } if ($query->num_rows > 0) { $delimiter = ","; $filename = "stock" . date('Y-m-d') . ".csv"; // 创建文件指针 $f = fopen('php://memory', 'w'); // 设置CSV列头 $fields = array('Date','Part.ID','Make','Model','Price','Cost'); fputcsv($f, $fields, $delimiter); // 逐行写入数据 while($row = $query->fetch_assoc()){ $lineData = array($row['date'], $row['pid'], $row['name'], $row['description'], $row['price'], $row['cost']); fputcsv($f, $lineData, $delimiter); } // 补充:将内存中的CSV文件输出到浏览器供下载 fseek($f, 0); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="' . $filename . '";'); fpassthru($f); exit; } else { echo "没有符合条件的数据"; }
额外提示
- 编写SQL时要注意字段列表的格式,最后一个字段后不要加逗号,这是高频出现的语法错误。
- 养成添加错误处理的习惯,通过
mysqli_error($db)可以快速获取SQL执行失败的具体原因,大幅提升调试效率。
内容的提问来源于stack exchange,提问作者Leakey Braxton
相关产品推荐
相关产品推荐

