【问题标题】:Why can't show data passed by getJSON?为什么不能显示getJSON传递的数据?
【发布时间】:2018-09-11 15:10:19
【问题描述】:

test-json.php读取数据库,并准备好JSON格式。

<?php
$conn = new mysqli("localhost", "root", "xxxx", "guestbook"); 
$result=$conn->query("select * From lyb limit 2"); 
echo '[';
$i=0;
while($row=$result->fetch_assoc()){  ?>
 {title:"<?= $row['title'] ?>",
        content:"<?= $row['content'] ?>",
        author:"<?= $row['author'] ?>",
        email:"<?= $row['email'] ?>",
        ip:"<?= $row['ip'] ?>"}
<?php 
if(
$result->num_rows!=++$i) echo ',';   
}
echo ']'    
?>

对于我的数据库,select * From lib limit 2 获取记录。

title    | content   | author   | email            |ip
welcome1 | welcome1  | welcome1 | welcome1@tom.com |59.51.24.37
welcome2 | welcome2  | welcome2 | welcome2@tom.com |59.51.24.38

php -f /var/www/html/test-json.php

[ {title:"welcome1",
         content:"welcome1",
        author:"welcome1",
         email:"welcome1@tom.com",
        ip:"59.51.24.37"},
{title:"welcome2",
         content:"welcome2",
        author:"welcome2",
         email:"welcome2@tom.com",
        ip:"59.51.24.38"}]

test-json.php 获取一些 JSON 格式的数据。

现在回调数据并在表格中显示。

<script src="http://127.0.0.1/jquery-3.3.1.min.js"></script>
<h2 align="center">Ajax show data in table</h2>
<table>
    <tbody id="disp">
        <th>title</th>
        <th>content</th>
        <th>author</th>
        <th>email</th>
        <th>ip</th>
    </tbody>
</table>

<script> 
$(function(){
    $.getJSON("test-json.php", function(data) {
        $.each(data,function(i,item){
            var tr = "<tr><td>" + item.title + "</td>"    +
                        "<td>"  + item.content  + "</td>" +
                        "<td>"  + item.author  + "</td>"  +
                        "<td>"  + item.email  + "</td>"   +
                        "<td>"  + item.ip  + "</td></tr>"
            $("#disp").append(tr);
        });
    });
});
</script>

输入127.0.0.1/test-json.html,为什么网页上没有test-json.php创建的数据?

我得到的如下:

Ajax show data in table
title   content author  email   ip

我的期望如下:

Ajax show data in table
title   content author  email   ip
welcome1  welcome1  welcome1  welcome1@tom.com  59.51.24.37
welcome2  welcome2  welcome2  welcome2@tom.com  59.51.24.38

【问题讨论】:

  • 也发布您的PHP 代码。
  • 您的 test-json.php 文件未生成有效的 JSON,因此无法解析。在 JSON 中,必须引用对象键。你应该在你的 PHP 中使用json_encode() 来生成一个有效的字符串

标签: javascript json ajax getjson


【解决方案1】:

问题是您的 PHP 脚本的响应不是有效的 JSON。

在 JSON 中,必须引用对象键。

与其尝试滚动您自己的 JSON 响应,不如使用 json_encode() 为您完成。例如

<?php
$conn = new mysqli("localhost", "root", "xxxx", "guestbook"); 
$stmt = $conn->prepare('SELECT title, content, author, email, ip FROM lyb limit 2');
$stmt->execute();
$stmt->bind_result($title, $content, $author, $email, $ip);
$result = [];
while ($stmt->fetch()) {
    $result[] = [
        'title'   => $title,
        'content' => $content,
        'author'  => $author,
        'email'   => $email,
        'ip'      => $ip
    ];
}
header('Content-type: application/json; charset=utf-8');
echo json_encode($result);
exit;

你不必使用prepare()bind_result(),这只是我在使用 MySQLi 时的偏好。

这会产生类似的东西

[
  {
    "title": "welcome1",
    "content": "welcome1",
    "author": "welcome1",
    "email": "welcome1@tom.com",
    "ip": "59.51.24.37"
  },
  {
    "title": "welcome2",
    "content": "welcome2",
    "author": "welcome2",
    "email": "welcome2@tom.com",
    "ip": "59.51.24.38"
  }
]

【讨论】:

    【解决方案2】:

    您的PHP 代码中有很多错误。

    这是服务器端应该如何处理的事情(PHP):

    文件名:test-json.php

    1. 从数据库中获取记录。

    2. 使用已经从数据库中获取的记录填充一个数组(我在下面的代码中将该数组命名为$data)。

    3. 将该数组编码为JSON 格式并回显结果。

    下面是客户端应该如何处理的事情(JavaScript):

    1. test-json.php 文件发出AJAX 请求。

    2. 如果该请求成功,则遍历返回的 JSON 并填充一个变量(我将其命名为“html”),该变量将包含所有 HTML 代码(以及接收到的数据),它将被附加到表格中。

    3. 将该变量(我命名为“html”)附加到表中,这样我们就可以在每个 AJAX 请求仅访问一次 DOM 时获得性能。

    说了这么多,解决办法如下:

    PHP 代码 - 文件名:test-json.php:

    <?php
    // use the column names in the 'SELECT' query to gain performance against the wildcard('*').
    $conn = new MySQLi("localhost", "root", "xxxx", "guestbook"); 
    
    $result = $conn->query("SELECT `title`, `content`, `author`, `email`, `ip` FROM `lyb` limit 2"); 
    
    // $data variable will hold the returned records from the database.
    $data = [];
    
    // populate $data variable.
    // the '[]' notation(empty brackets) means that the index of the array is automatically incremented on each iteration.
    while($row = $result->fetch_assoc()) {
      $data[] = [
        'title'   => $row['title'],
        'content' => $row['content'],
        'author'  => $row['author'],
        'email'   => $row['email'],
        'ip'      => $row['ip']
      ];
    }
    
    // convert the $data variable to JSON and echo it to the browser.
    header('Content-type: application/json; charset=utf-8');
    echo json_encode($data);
    

    JavaScript代码

    $(function(){
        $.getJSON("test-json.php", function(data) {
            var html = '';
            $.each(data,function(key, value){
                html += "<tr><td>" + value.title + "</td>"    +
                            "<td>"  + value.content  + "</td>" +
                            "<td>"  + value.author  + "</td>"  +
                            "<td>"  + value.email  + "</td>"   +
                            "<td>"  + value.ip  + "</td></tr>";
    
            });
            $("#disp").append(html);
        });
    });
    

    Learn more 关于json_encode 函数。

    希望我把你推得更远。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 2017-02-25
      • 2012-04-03
      相关资源
      最近更新 更多