从 PHP 脚本返回 JSON 和 HTML

Posted

技术标签:

【中文标题】从 PHP 脚本返回 JSON 和 HTML【英文标题】:returning JSON and HTML from PHP script 【发布时间】:2011-01-06 04:33:21 【问题描述】:

您好在这里搜索了问题,但找不到任何东西。我是编写 php 和 jQuery 的新手,所以请耐心等待。

我要做的是使用 jQuery 向我的脚本发送一个 ajax 请求,该脚本对我的数据库中的数据运行 mysql 查询,并使用 php 的 json_encode 将其序列化为 JSON 格式。然后使用可用的 json2.js 脚本解析响应。所有这些都可以正常工作,但我还想从此脚本返回更多数据,而不仅仅是 JSON。

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

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_encode 以将此脚本用于不只是 json 填充?

谢谢,这个网站很好地回答了我的菜鸟问题。

我的 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;`

【问题讨论】:

【参考方案1】:

不要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

【讨论】:

感谢您的回复,但我不确定如何实现它,因为我只需要回显一次 html,而不是为 cmets 创建的 for 循环。你能看看我添加到问题中的代码并指出我正确的方向吗?谢谢! 如果你看看我的回答,你可以在不使用数组的情况下做同样的事情。所以echo json_encode($html); 然后在成功函数中你只需通过$data 访问它。 如何处理 jQuery 添加到 HTML 字符串中的斜线? 那很可能不是 jQuery,而是你的 PHP/Apache。【参考方案2】:

您可能对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 
        ; 
    ); 

【讨论】:

【参考方案3】:

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

<?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:

<?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;
        
    
);

【讨论】:

感谢您的回答 - 我这样做了,但现在由于数组涉及 for 循环,因此我的数据库中的每个条目都在迭代 html。有没有一种方法可以将数据库中的信息数组与单个 html 变量结合起来生成只显示 html: 代码一次的 json?

以上是关于从 PHP 脚本返回 JSON 和 HTML的主要内容,如果未能解决你的问题,请参考以下文章

Ajax以JSON访问从PHP返回的多维数组

PHP 和 JSON:返回合适的格式

使用 jQuery 从 PHP 文件返回 JSON 数据

从 PHP 运行返回错误。阿贾克斯?

使用 jquery 解析 php 脚本返回的 JSON 字符串

php返回json数据函数实例_php技巧_脚本之家