大学项目WebService开发遇报错:Uncaught Error: Call to a member function fetchAll() on null
排查并修复「Call to a member function fetchAll() on null」错误
这个错误的核心原因很明确:你调用fetchAll()的$result变量是null,说明$conn->query()执行失败了,没有返回有效的PDOStatement对象。下面是一步步的排查和修复方案:
1. 先开启PDO错误提示,定位具体问题
默认情况下PDO会静默失败(只返回null不报错),所以第一步必须让它抛出详细错误信息,帮你找到根因:
<?php header("Content-type: application/json"); try { $conn = new PDO("mysql:host=localhost;dbname=user;", "user", "pass"); // 开启异常模式,强制PDO抛出所有数据库相关错误 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $loc = $_GET["location"]; $type = $_GET["type"]; if(isset($_GET["location"]) && isset($_GET["type"])) { // 后续查询逻辑写在这里 } } catch(PDOException $e) { echo json_encode(["error" => "数据库错误详情: " . $e->getMessage()]); exit; }
运行这段代码后,你就能看到具体是连接失败、SQL语法错误还是其他问题导致的查询失败。
2. 替换不安全的字符串拼接查询,用预处理语句
你原来的代码大概率是直接把$loc和$type拼进SQL里,这不仅有严重的SQL注入风险,还会因为参数里的特殊字符(比如单引号、空格)导致SQL语法错误,让query()返回null。改用预处理语句能同时解决这两个问题:
if(isset($_GET["location"]) && isset($_GET["type"])) { // 用占位符替代直接拼接变量,避免语法错误和注入 $stmt = $conn->prepare("SELECT * FROM your_table WHERE location = :loc AND type = :type"); // 绑定参数,PDO会自动处理特殊字符转义 $stmt->bindParam(':loc', $loc); $stmt->bindParam(':type', $type); // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode($result); } else { echo json_encode(["error" => "缺少必要参数: location 或 type"]); }
注意把your_table替换成你实际要查询的表名。
3. 补充参数有效性校验
虽然你用了isset(),但最好再检查参数是否为空,避免空值导致的无意义查询:
if(isset($_GET["location"]) && isset($_GET["type"]) && !empty(trim($_GET["location"])) && !empty(trim($_GET["type"]))) { // 执行查询逻辑 } else { echo json_encode(["error" => "参数无效: location 和 type 都必须提供非空有效值"]); }
按照这几步调整后,不仅能解决当前的fetchAll()错误,还能让你的代码更安全、更健壮。
内容的提问来源于stack exchange,提问作者Gabriel Ganchev
相关产品推荐
相关产品推荐

