PHP不向JavaScript发送JSON对象

PHP not Sending JSON Object to JavaScript

本文关键字:JSON 对象 发送 JavaScript 不向 PHP      更新时间:2023-09-26
<?php
    header("Content-Type: application/json");
    if(isset($_POST['limit'])){
        $limit = preg_replace('#[^0-9]#', '', $_POST['limit']);
        require_once("connect_db.php");
        $i = 0;
        $jsonData = '{';
        $sqlString = "SELECT * FROM tablename ORDER BY RAND() LIMIT $limit";
        $query = mysqli_query($con, $sqlString) or die (mysqli_error()); 
        while ($row = mysqli_fetch_array($query)) {
            $i++;
            $id = $row["id"]; 
            $title = $row["title"];
            $cd  = $row["creationdate"];
            $cd = strftime("%B %d, %Y", strtotime($cd));
            $jsonData .= '"article'.$i.'":{ "id":"'.$id.'","title":"'.$title.'", "cd":"'.$cd.'"  },';
        }
        $now = getdate();
        $timestamp = $now[0];
        $jsonData .= '"arbitrary":{"itemcount":'.$i.', "returntime":"'.$timestamp.'"}';
        $jsonData .= '}';
        echo $jsonData;
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript">
            var myTimer;
            function ajax_json_data(){
            var databox = document.getElementById("databox");
            var arbitrarybox = document.getElementById("arbitrarybox");
            var hr = new XMLHttpRequest();
            hr.open("POST", "json_mysql_data.php", true);
            hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            hr.onreadystatechange = function() {
                if(hr.readyState == 4 && hr.status == 200) {
                    var d = JSON.parse(hr.responseText);
                    arbitrarybox.innerHTML = d.arbitrary.returntime;
                    databox.innerHTML = "";
                    for(var o in d){
                        if(d[o].title){
                            databox.innerHTML += '<p><a href="page.php?id='+d[o].id+'">'+d[o].title+'</a><br>';
                            databox.innerHTML += ''+d[o].cd+'</p>';
                            }
                        }
                    }
                }
                hr.send("limit=4");
                databox.innerHTML = "requesting...";
                myTimer = setTimeout('ajax_json_data()',6000);
            }
        </script>
    </head>
    <body>
        <h2>Timed JSON Data Request Random Items Script</h2>
        <div id="databox"></div>
        <div id="arbitrarybox"></div>
        <script type="text/javascript">ajax_json_data();</script>
    </body>
</html>

PHP代码放在名为"json_mysql_data.php"的单独文件中。我只是按照这个教程https://www.youtube.com/watch?v=-Bv8P5oQnFw,它运行得很好,但不适合我。我单独用mysql测试了"connect_db.php",它工作得很好。在我看来,php不去传递if (isset ($_POST['limit'])),但为什么…在html文件上,我从javascript代码中得到"请求…"消息,这意味着正在等待PHP。谢谢大家的帮助。

您检查就绪状态并在 onreadystatechange函数中使用响应JSON 更改databox的内容:

hr.onreadystatechange = function(aEvt) {
    if(hr.readyState == 4 && hr.status == 200) {
        …
        databox.innerHTML += …;
        …
    }
    …
    databox.innerHTML = "requesting...";
    …
}

但是你改变了databox的HTML:

databox.innerHTML = "requesting...";

仍然 onreadystatechange函数的块内,之后,您收到响应,因此databox将始终显示"requesting...",无论您收到什么。你必须把打印"requesting..."的部分移到它外面:

hr.onreadystatechange = function(aEvt) {
    if(hr.readyState == 4 && hr.status == 200) {
        …
        databox.innerHTML += …;
        …
    }
    …
}
…
databox.innerHTML = "requesting...";
…

:

此外,似乎您的函数没有正确定义,正如您所看到的,MDN参考页面示例中的函数接收一个参数:

req.onreadystatechange = function(aEvt) {
    …
}

但是你的没有这样的参数:

hr.onreadystatechange = function() {
    …
}

谢谢你的帮助@arielnmz。我找到了问题所在。PHP在getDate()函数上有问题,因为date.timezone字段没有在PHP.ini文件中配置。在文件中添加以下行修复了这个问题:

date.timezone = "UTC"