代码之家  ›  专栏  ›  技术社区  ›  Dave Kiss

从PHP脚本返回JSON和HTML

  •  14
  • Dave Kiss  · 技术社区  · 14 年前

    嗨,在这里搜索了所有问题,但什么都找不到。我对编写PHP和jQuery是个新手,请放心。

    我要做的是使用jquery向脚本发送一个Ajax请求,该脚本对数据库中的数据运行一个mysql查询,并使用php的json_编码将其序列化为json格式。然后使用可用的json2.js脚本解析响应。所有这些工作都很好,但是我也希望从这个脚本返回更多的数据,而不仅仅是JSON。

    主要是,我还想在json_编码之前回显以下行:

    echo "<h1 style='margin-left: 25px;'>$num_rows Comments for $mysql_table</h1>";
    

    但是,我的jquery正在评估Ajax成功期间的整个响应,这使得json.parse函数失败,因为脚本返回的格式无效。

            success: function(data) {
                //retrieve comments to display on page by parsing them to a JSON object
                var obj = JSON.parse(data);
                        //loop through all items in the JSON array
                        for (var x = 0; x < obj.length; x++) {
                            //Create a container for the new element
                            var div = $("<div>").addClass("bubble").appendTo("#comments");
                            //Add author name and comment to container
                            var blockquote = $("<blockquote>").appendTo(div);
                                $("<p>").text(obj[x].comment).appendTo(blockquote);
                            var cite = $("<cite>").appendTo(div);
                                $("<strong>").text(obj[x].name).appendTo(cite);
                                $("<i>").text(obj[x].datetime).appendTo(cite);
                        }
                    $("#db").attr("value", '' + initialComments + '');
        }   
    

    有人知道我如何返回HTML行以及JSON编码,以便使用这个脚本进行JSON填充之外的其他操作吗?

    谢谢,这个网站在回答我的noob问题方面非常出色。

    我的PHP:

        for ($x = 0, $numrows = mysql_num_rows($result); $x < $numrows; $x++) {
    $row = mysql_fetch_assoc($result);
        $comments[$x] = array("name" => stripslashes($row["name"]), "comment" => stripslashes($row["comment"]), "datetime" => date("m/d/Y g:i A", strtotime($comment['datetime'])));        
    }
    
    //echo "<h1 style='margin-left: 25px;'>$num_rows Comments for $mysql_table</h1>";
    
    $response = json_encode($comments);
    echo $response;`
    
    3 回复  |  直到 11 年前
        1
  •  19
  •   Horia Dragomir    11 年前

    不要 echo 行,保存在变量中。构造一个简单数组 $response = array( 'html' => $the_line_you_wanted_to_echo, 'jsobject' => $the_object_you_were_going_to_send_back ); 把它寄回去(通过 json_encode 相反。

    另外,您不需要json2.js,jquery有一个优秀的json解析器。

    你可以这样装 $.get( 'your/url', { params : here }, success, 'JSON' );

    更改以匹配新引入的迭代。

    for ($x = 0, $num_rows = mysql_num_rows($result); $x < $num_rows; $x++) {
        $row = mysql_fetch_assoc($result);
        $comments[$x] = array(
            "name" => stripslashes($row["name"]), 
            "comment" => stripslashes($row["comment"]), 
            "datetime" => date("m/d/Y g:i A", strtotime($comment['datetime']))
        );        
    }
    
    $html = "<h1 style='margin-left: 25px;'>$num_rows Comments for $mysql_table</h1>";
    
    echo json_encode(array( 'comments' => $comments, 'html' => $html ));
    

    然后,在您的javascript中,

    function success( parsedObject ){
        parsedObject.html; // "<h1 style..."
        parsedObject.comments; // an array of objects
        parsedObject.comments[0].name 
        + " on " + parsedObject.comments[0].datetime 
        + " said \n" + parsedObject.comments[0].comment; // for example
    }
    
        2
  •  5
  •   anomareh    14 年前

    如上所述,只需将您想要返回的所有数据放到一个数组中并对其进行编码。

    <?php
    
    echo json_encode(array(
        'html' => $html,
        'foo' => $bar,
        'bar' => $baz
    ));
    
    ?>
    

    另外,如前所述,您不需要json2.js。通过将数据类型指定为JSON,可以使用jquery的任何ajax函数解析JSON数据。

    $.ajax({
        type: 'POST',
        url: 'path/to/php/script.php',
        dataType: 'json',
        data: 'foo=bar&baz=whatever',
        success: function($data) {
            var html = $data.html;
            var foo = $data.foo;
            var bar = $data.bar;
    
            // Do whatever.
        }
    });
    

    编辑 几乎和霍丽亚说的一样。我能看到的另一个变化是,如果你想要相同数组中的所有内容。

    例如:

    菲律宾:

    <?php
    
    // You have your comment array sent up as you want as $comments
    // Then just prepend the HTML string onto the beginning of your comments array.
    // So now $comments[0] is your HTML string and everything past that is your comments.
    $comments = array_unshift($comments, $your_html_string);
    
    echo json_encode($comments);
    
    ?>
    

    jQuery:

    $.ajax({
        type: 'POST',
        url: 'path/to/php/script.php',
        dataType: 'json',
        data: 'foo=bar&baz=whatever',
        success: function($comments) {
            // Here's your html string.
            var html = $comments[0];
    
            // Make sure to start at 1 or you're going to get your HTML string twice.
            // You could also skip storing it above, start at 0, and add a bit to the for loop:
            // if x == 0 then print the HTML string else print comments.
            for (var x = 1; x < $comments.length; x++) {
                // Do what you want with your comments.
                // Accessed like so:
                var name = $comments[x].name;
                var comment = $comments[x].comment;
                var datetime = $comments[x].datetime;
            }
        }
    });
    
        3
  •  0
  •   David Robbins    14 年前

    你可能对 jLinq ,一个允许您查询javascript对象的javascript库。一个示例查询是:

    var results = jLinq.from(data.users)
        .startsWith("first", "a")
        .orEndsWith("y")
        .orderBy("admin", "age")
        .select();
    

    jlinq支持查询嵌套对象和执行联接。例如:

    var results = jLinq.from(data.users) 
        .join(data.locations, //the source array 
            "location", //the alias to use (when joined) 
            "locationId", // the location id for the user 
            "id" // the id for the location 
        ) 
        .select(function(r) { 
            return { 
                fullname:r.first + " " + r.last, 
                city:r.location.city, 
                state:r.location.state 
            }; 
        });