fetch_assoc()无数据返回,2017-18会话JSON返回null技术求助
针对特定Session值查询异常的排查与解决
嘿,我来帮你搞定这个头疼的问题!看起来2017-18这个session值总是返回null,甚至fetch_assoc()拿不到数据,而2015-16、2016-17都正常,咱们一步步拆解排查:
1. 先解决SQL注入隐患,同时避免字符串匹配问题
你现在直接把$session拼进SQL语句里,不仅有SQL注入风险,还可能因为字符串转义的问题导致2017-18匹配不到数据库里的记录。比如如果数据库里的存储有特殊字符,或者输入没转义,查询就会失效。
赶紧改成预处理语句,既安全又能规避这类问题:
include "../session-check.php"; include "../../connection/index.php"; $id = $_SESSION['id']; $session = $_POST['cmbImageSession']; // 改用预处理语句,避免字符串拼接的坑 $q = "SELECT id, event_name FROM gallery WHERE session=? ORDER BY event_name"; $stmt = $conn->prepare($q); $stmt->bind_param("s", $session); // "s"表示参数是字符串类型 $stmt->execute(); $result = $stmt->get_result();
2. 先手动验证数据库里的2017-18数据
先打开MySQL客户端(比如phpMyAdmin、Navicat),手动执行这条查询:
SELECT id, event_name FROM gallery WHERE session='2017-18' ORDER BY event_name;
- 如果这条查询也没返回数据:那问题出在数据库本身,检查2017-18对应的记录是否存在,有没有拼写错误(比如不小心加了空格、全角字符)。
- 如果有返回数据:那就是PHP代码处理的问题,继续往下查。
3. 给代码加调试,看看fetch_assoc()到底出了啥问题
在代码里加一些调试输出,直观看到查询的执行状态和结果:
// 执行查询后,先检查是否出错 if (!$result) { die("查询出错啦: " . $conn->error); // 直接输出MySQL的错误信息,快速定位问题 } // 看看结果集有多少行 echo "返回的行数: " . $result->num_rows . "<br>"; // 循环拿数据的时候,打印每一行看看 $options = []; while ($row = $result->fetch_assoc()) { $options[] = $row; print_r($row); // 把拿到的每一行数据打出来,确认是不是正确获取了 } // 最后输出JSON前,先看看$options里有没有内容 echo json_encode($options);
这样你就能清楚看到2017-18对应的查询到底有没有拿到数据,以及数据结构对不对。
4. 排查JSON编码的坑
如果数据库里有数据,但JSON返回null,大概率是数据里有无法被JSON编码的字符(比如特殊编码的中文、控制字符)。可以给json_encode加两个参数来处理:
echo json_encode($options, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
JSON_PARTIAL_OUTPUT_ON_ERROR会在遇到无法编码的字符时跳过错误部分继续输出,而不是直接返回null,帮你定位到底是哪条数据出了问题。
5. 确认前端传的参数是不是干净的
有时候前端传递的cmbImageSession值可能藏着小问题,比如末尾多了个空格,变成了"2017-18 ",自然和数据库里的"2017-18"匹配不上。可以在接收参数时做个清理:
$session = trim($_POST['cmbImageSession']);
把前后的空格都去掉,确保参数和数据库里的存储完全一致。
内容的提问来源于stack exchange,提问作者Twinkle
相关产品推荐
相关产品推荐

