如何从WordPress自定义数据库表取回wp_json_encode数据及解析异常问题
解决WordPress中JSON数据无法解码的问题
看起来你遇到的问题出在获取数据的方式上,咱们一步步来修正:
1. 问题根源:$wpdb->get_results() 返回的不是单个字符串
你现在用$wpdb->get_results()查询,它返回的是一个对象数组(哪怕只有一条结果),而不是直接的reward_details字段值。直接把这个数组传给json_decode()肯定会失败,因为它需要的是合法的JSON字符串。
2. 修正方案:获取正确的JSON字符串
有两种简单的方式拿到目标字符串:
方式一:用get_var()直接获取单个字段值
这是最直接的方式,因为你只需要reward_details这一个字段:
<?php $project_id = $_SESSION['project_id']; global $wpdb; // 用prepare防止SQL注入,这很重要! $string = $wpdb->get_var( $wpdb->prepare( "SELECT reward_details FROM wpxa_rewards WHERE project_id = %d", $project_id ) ); // 现在$string是合法的JSON字符串,可以解码了 $someArray = json_decode($string, true); // 先判断解码是否成功 if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解码失败:" . json_last_error_msg(); } else { // 统计奖励数量要取子数组的长度,因为你的JSON是包含三个数组的对象 $count = count( $someArray['reward_amount'] ); // 接下来就可以正常遍历数据了,比如: foreach ($someArray['reward_amount'] as $index => $amount) { $title = $someArray['reward_title'][$index]; $desc = $someArray['reward_description'][$index]; echo "<p>奖励:$title - $amount 元,描述:$desc</p>"; } } ?>
方式二:如果坚持用get_results(),需要提取对象属性
如果你因为某些原因必须用get_results(),要从返回的数组中取出第一个对象的reward_details属性:
<?php $project_id = $_SESSION['project_id']; global $wpdb; $results = $wpdb->get_results( $wpdb->prepare( "SELECT reward_details FROM wpxa_rewards WHERE project_id = %d", $project_id ) ); $someArray = []; if (!empty($results)) { $string = $results[0]->reward_details; $someArray = json_decode($string, true); // 同样检查解码是否成功 if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解码失败:" . json_last_error_msg(); } } // 后续操作同上 ?>
3. 额外注意事项
- SQL注入防护:一定要用
$wpdb->prepare()来处理查询参数,直接把$_SESSION['project_id']拼进SQL是非常危险的行为。 - 解码结果判断:每次调用
json_decode()后,最好用json_last_error()检查是否解码成功,方便排查问题(比如存储的JSON格式是否有错误)。 - 数组遍历逻辑:你的JSON结构是包含三个子数组的对象,所以
count($someArray)得到的是3(三个键值对),如果你要统计奖励的数量,应该取count($someArray['reward_amount'])。
内容的提问来源于stack exchange,提问作者Minesh
相关产品推荐
相关产品推荐

