数据库导出指定格式JSON时出现非法字符串偏移错误求助
解决"Illegal string offset"警告并正确导出JSON
首先咱们定位问题根源:你当前用的是PDOStatement::fetch()方法,它只会返回单条数据库记录(一个关联数组)。当你用foreach遍历这个单条记录的数组时,$result变量拿到的其实是每个字段的字符串值(比如示例里的"1"、"localhost"这些),这时候再去写$result["id"],就相当于尝试从一个字符串里按"id"这个偏移取值,完全不符合逻辑,自然触发了那个警告。
修复步骤
只需要把fetch()改成fetchAll(),就能获取到所有符合查询条件的记录数组,之后的foreach才能正确遍历每条记录:
public function db2json($query){ $stmt = $this->db->prepare($query); $stmt->execute(); // 替换fetch为fetchAll,获取全部查询结果的数组 $data = $stmt->fetchAll(PDO::FETCH_ASSOC); $output = []; foreach ( $data as $result ) { $user = []; $user["id"] = $result["id"]; $user["siteId"] = $result["siteId"]; $user["lastIp"] = $result["lastIp"]; $user["lastLogin"] = $result["lastLogin"]; $user["loginCountry"] = $result["loginCountry"]; $output[$result["siteUrl"]][$result["identity"]] = $user; } echo json_encode($output, JSON_PRETTY_PRINT); }
额外提示
- 你提供的示例JSON最后一个字段后多了个冗余逗号(
"loginCountry": "GB", }),不过json_encode会自动处理这类格式问题,无需手动修改。 - 如果你的查询可能返回空结果,建议先判断
$data是否为空,避免无意义的空数组遍历操作。
内容的提问来源于stack exchange,提问作者Toozyne
相关产品推荐
相关产品推荐

