Php 在JSON上循环(添加HTML)

Php 在JSON上循环(添加HTML),php,jquery,mysql,json,Php,Jquery,Mysql,Json,我试图循环使用PHP的JSON输出,并为每个索引分配一个列表项 我有两个不同的问题 编码是在不需要的时候添加奇怪的斜杠和引号 解析JSON字符串时,即使从测试php数组中设置,也会出现类型错误(参数无效) PHP $data= json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); echo json_encode($data); JSON "[ {\"id\":\"1\",\"user_id\":\"1\",\"message\":\

我试图循环使用PHP的JSON输出,并为每个索引分配一个列表项

我有两个不同的问题

  • 编码是在不需要的时候添加奇怪的斜杠和引号
  • 解析JSON字符串时,即使从测试php数组中设置,也会出现类型错误(参数无效)
PHP

$data= json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
echo json_encode($data);
JSON

"[
    {\"id\":\"1\",\"user_id\":\"1\",\"message\":\"MSG 1\"},
    {\"id\":\"2\",\"user_id\":\"1\",\"message\":\"MSG 2\"},
    {\"id\":\"3\",\"user_id\":\"1\",\"message\":\"MSG 3 \"},
]"
jQuery

  $.ajax({ url: 'chat.php',
    dataType: 'json',
    type: 'post',
    error: function(statusCode, errorThrown) {
                updateError(statusCode, errorThrown);
            },
    success: function(data){

         $.each(data, function() {
                $.each(this, function(k, v) {
                    $('<li data-msgid="'+data.id+'">' + data.user_id + '::' + data.message + '</li>').appendTo('#chat_area');
                 });
            });

        }
$.ajax({url:'chat.php',
数据类型:“json”,
键入:“post”,
错误:函数(状态代码、错误抛出){
updateError(状态代码、错误抛出);
},
成功:功能(数据){
$.each(数据,函数(){
$。每个(此,函数(k,v){
$(“
  • “+data.user_id+”::“+data.message+”
  • ”).appendTo(“#聊天区”); }); }); }
    }))

    我使用ajax调用而不是json,因为我最终将在同一个函数中传递数据。
    非常感谢您的帮助。

    您正在编码两次:

    $data= json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
    echo json_encode($data);
    
    删除第一个,仅对最终数据进行编码:

    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    ...
    echo json_encode($data);
    

    由于JSON使用双引号来包含字符串,因此需要反斜杠来转义双引号。如果需要,您可以替换它们,但我觉得这就是字符串插入数据库的方式字符串不包含数据库中的引号。其他json调用输出正常,但是,它们是输出中的单个索引。这修复了斜杠问题,但是现在它在打印的列表元素上返回未定义。它得到的是当前的结果,只是没有正确地打印出来。@Ray检查内部循环中的变量,至少检查
    数据。id
    不会像
    数据[0]那样存在。id
    数据[1]。id
    ,等等。您可能想要的是
    v
    值。对内部循环中的变量执行
    console.log()
    ,然后使用您需要的。@对了,您可能只需要一个
    。每个()
    loop:外部循环使用内部循环的语法,您现在可以直接访问变量。@jereon如果删除第一个循环,我只能访问第一个元素,而不能使用v var,因为数组中有多个“键”。这是针对聊天室的,因此每次都会有多个项目出现在阵列中。PHP使用长轮询(comet),但仍可能返回多个项。我该怎么做呢。@Ray看起来你只需要一个循环
    $。每个循环(数据、函数(k,v){
    ,然后你就可以访问
    v.id
    ,等等。