如何将数据发送到php文件并将其作为当前页面加载?

时间:2018-10-14 23:38:05

标签: javascript php ajax

我正在尝试通过POST将所选考试的JSON发送到take_exam.php页面,以便take_exam.php可以为学生显示测试。

exams.php文件包含考试列表。学生可以选择要参加的考试。我目前正在将{action:“ get_exam”,考试:“ exam_name”}的JSON发送到take_exam.php,以便它可以为学生显示考试。

用于将帖子数据发送到take_exam.php的JavaScript代码

    var btns =document.getElementsByClassName("stu-take-test")
    for (var i =0; i < btns.length; i++){
        btns[i].addEventListener("click", function(){
            var obj = new Object;
            obj.action = "get_exam";
            obj.exam = this.id;

            str_json = JSON.stringify(obj);

            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    location.replace("take_exam.php")

                }

            };

            xhttp.open("POST", "take_exam.php", true);
            xhttp.setRequestHeader("Content-type", "application/json");
            xhttp.send(str_json);
        });

    }
take_exam.php

PHP代码以获取通过ajax发送的JSON,仅出于测试目的,我试图打印收到的JSON。将来,该文件将与数据库通信,以为学生加载测试。但是看起来该文件什么也没收到:

    <?php

            $real_json = file_get_contents('php://input');
            $decoded_json = json_decode($real_json);

            print_r($decoded_json); 

Ajax用take_test.php替换了exam.php,以便学生参加所选的考试

1 个答案:

答案 0 :(得分:0)

那是因为您在成功XHR(readyState == 4和status == 200)之后将重定向到没有有效负载的相同脚本。尝试评论location.replace("take_exam.php"),看看会发生什么。

但是也许您想检查$decoded_json是否为stdClass(这表示已接收并解码了json)并将结果记录到控制台:

<?php

$real_json = file_get_contents('php://input');
$decoded_json = json_decode($real_json);
if($decoded_json instanceof stdClass) {
    // do somethong
    var_dump($decoded_json);
    // and die maybe =)
    die();
}

和JS中的

if (this.readyState == 4 && this.status == 200) {
    // location.replace("test.php")
    // do something with response
    console.log(this.response);
}

更新

将其保存在一个PHP文件中(假设为test.php,因为xhttp.open("POST", "test.php", true);),然后在浏览器中打开。

<?php
            $real_json = file_get_contents('php://input');
            $decoded_json = json_decode($real_json);
            if($decoded_json instanceof stdClass) {
                var_dump($decoded_json);
                die();
            }
?>
<button class="stu-take-test" id="math">Math</button>
<div id="response_container"></div>
<script>
var btns =document.getElementsByClassName("stu-take-test")
    for (var i =0; i < btns.length; i++){
        btns[i].addEventListener("click", function(){
            var obj = new Object;
            obj.action = "get_exam";
            obj.exam = this.id;

            str_json = JSON.stringify(obj);

            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    document.getElementById('response_container').innerHTML = this.response;
                }

            };

            xhttp.open("POST", "test.php", true);
            xhttp.setRequestHeader("Content-type", "application/json");
            xhttp.send(str_json);
        });

    }
</script>