回显所有 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_name
和item_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 行的主要内容,如果未能解决你的问题,请参考以下文章
php,json_encode,嵌套数组,带有一个“左连接”查询