回显所有 json_encoded 行

Posted

技术标签:

【中文标题】回显所有 json_encoded 行【英文标题】:Echo all json_encoded rows 【发布时间】:2014-07-04 15:28:02 【问题描述】:

我正在尝试循环访问我的数据库并将所有与连接表匹配的行输出。

我有以下两张表:

quest_items 存储与项目相关的所有数据:

join_questitems 存储玩家 ID 和玩家拥有的物品之间的关联:

JS:传入查询表所需的所有信息...

$.getJSON("phpscripts.php", 
    "_player" : Player,
    "_playerID" : UserID
,
function(returned_data) 
    var item_name = returned_data.item_name;
    item_image = returned_data.item_image;

    $(".questItems").html(item_name + ", " + item_image);       
   
);  

PHP:

$statsArray = array();
$qry = 
    'SELECT qi.* 
    FROM quest_items qi
    LEFT JOIN join_questitems jqi ON (qi.item_id = jqi.item_id)
    WHERE jqi.user_id = "' . $playerID . '"';

$result = $mysqli->query($qry) or die(mysqli_error($mysqli));

while ($row = $result->fetch_assoc()) 
    $myrow = json_encode($row);
    array_push($statsArray, $myrow);
   
$k = 0;
while ($k < count($statsArray)) 
    echo $statsArray[$k];
    $k++;

但如果我只做一排,我会得到输出,但只有一排。我需要两行:

while ($row = $result->fetch_assoc()) 
    echo json_encode($row);
    exit;
   

$(".questItems").html(item_name + ", " + item_image) 给出:rice, test/path.png

为什么我不能遍历包含 json_encoded 行的 PHP 数组并输出它们?我必须将item_nameitem_image 设置为数组并循环遍历数组吗?


编辑:

$(".questItems").append(item_name + ", " + item_image) 也不起作用

调试器的网络输出显示正在输出行,但在第一行,我的 UTF-8 字符 fàn 在客户端输出中出现乱码(如您所见)。这很奇怪,因为在我的phpscripts.php 文件的顶部,我放了mysqli_set_charset($mysqli, "utf8");

【问题讨论】:

现在我明白了,你接受了我的建议。 @Viscocent 是的,抱歉忘记接受您的回答。谢谢你 :) 刚刚接受。 我认为您希望 .append() 附加文本而不是覆盖当前存在的文本,而不是 .html(),不是吗? @Ohgodwhy 看到上面的更新 它不会工作,因为你只返回第一行;因为你在循环中使用了exit 【参考方案1】:

您不应单独编码每一行。将所有结果放入一个数组中,完成后在该数组上调用json_encode

while ($row = $result->fetch_assoc()) 
    $statsArray[] = $row;

echo json_encode($statsArray);

然后在 javascript 中你需要遍历返回的数组:

$.getJSON("phpscripts.php", 
    "_player" : Player,
    "_playerID" : UserID
,
    function(returned_data) 
        $.each(returned_data, function(i, e) 
            var item_name = e.item_name;
            var item_image = e.item_image;

            $(".questItems").append(item_name + ", " + item_image + "<br/>");       
        );
    ;  
);

【讨论】:

你能解释一下为什么我不能对每一行进行编码吗? 因为结果不是有效的 JSON。 $.getJSON 期望响应是单个对象的 JSON 表示。你要返回多个数组,你需要把它们收集到一个数组中,这意味着它们周围必须有[]【参考方案2】:

而不是这样:

while ($row = $result->fetch_assoc()) 
    echo json_encode($row); 
    exit; //<--- this code breaks the while loop;
  

有这个:

$quest_items = array();
while ($row = $result->fetch_assoc()) 
    $quest_items[] = $row;
  

echo json_encode($quest_items);
exit;

因为 exit 会触发脚本停止(即使在循环内),所以您只会得到第一行。

【讨论】:

你只对最后一行进行编码,而不是对$quest_items做任何事情。

以上是关于回显所有 json_encoded 行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用json_encode回显没有反斜杠的值[重复]

json_encode 不适用于 PDO 获取的数据

JSON_Encode 输出奇数的额外值

php,json_encode,嵌套数组,带有一个“左连接”查询

带有选项 JSON_UNESCAPED_UNICODE 的 json_encode [关闭]

带有 Easy APN 的丹麦语字符