PHP PDO读取数据库JSON字段title报错:Illegal string offset 'title'求助
解决 "Illegal string offset 'title'" 报错问题
这个错误我太熟悉了——你犯了一个很常见的JSON解析顺序错误,咱们一步步拆解问题并解决:
错误原因分析
你当前的代码里,$row['menu_content']是数据库存储的JSON字符串,而你直接尝试用$row['menu_content']['title']去取属性,这就相当于试图从普通文本字符串里用数组下标取值,PHP自然会报"非法字符串偏移"的错误。而且你还把['title']写到了json_decode的参数里,逻辑完全搞反了。
另外,你的JSON数据是被数组包裹的(开头是[,结尾是]),所以解析后会得到一个数组,而不是直接的对象/关联数组,这也是容易踩坑的点。
修复后的代码
把你前端表格里对应<td>的代码替换成下面这段:
<td> <?php // 第一步:将JSON字符串解析为PHP关联数组 $menu_content_data = json_decode($row['menu_content'], true); // 第二步:安全获取title值(处理解析失败、结构异常的情况) if (is_array($menu_content_data) && !empty($menu_content_data) && isset($menu_content_data[0]['title'])) { // 用htmlspecialchars转义特殊字符,避免XSS攻击 echo htmlspecialchars($menu_content_data[0]['title']); } else { // 解析失败或结构不对时显示默认内容 echo '未设置标题'; } ?> </td>
关键细节说明
- 正确的解析顺序:先对整个
$row['menu_content']字符串执行json_decode,得到PHP数组后再去取title属性,而不是反过来。 - 处理数组包裹的JSON:你的JSON是
[{"title":...}]格式,解析后是一个数组,所以要通过$menu_content_data[0]['title']访问第一个元素里的title字段。 - 安全判断:加入
is_array、!empty、isset的判断,防止JSON格式错误、数据为空或者结构变更时出现新的报错。 - XSS防护:用
htmlspecialchars输出内容,避免用户输入的特殊字符破坏页面结构或引发安全问题。
内容的提问来源于stack exchange,提问作者Mesut
相关产品推荐
相关产品推荐

