AJAX 以 JSON 格式向 PHP 提交数据


AJAX submit data to PHP in JSON

我正在构建一个测验,我现在正在做的是接受用户的输入,并使用数据库中的答案表检查用户的提交,并将分数返回给用户。

我的测验采用多项选择的形式供用户选择,每个选项都有自己的价值。我为捕获数据所做的是序列化表单数据并将表单的所有数据存储在一个对象中。该对象如下所示:

{ 问题 1: '1', 问题 2: '2', 问题 3: '3', 问题 4

: '4', 问题 5: '5' }

因此,它将问题和用户答案存储为键值对,问题编号在前,用户选择的选项在后。从下面的代码中可以看出,我正在使用 .each 来取出键值对,而我想做的是每次 .each 运行时,对外部 checkanswer.php 脚本运行 ajax 命令以验证用户选择的选项。每次服务器返回匹配项时,php 都会向 ajax 返回一个文本字符串"correct",然后将 1 递增到创建的计数变量。我还在下面附加了 php 脚本。在@barmar的建议下,我已经完全删除了 json,但是 .each stil 下的 count 变量没有根据 ajax 调用返回的正确答案的数量给出正确的数字。++ 在阅读有关 ajax 工作方式的更多信息后,似乎 ajax 不会等待提交处理程序,因此我必须更改代码。一种方法是实际发送整个字符串,让 php 遍历键值对并在那里进行计数并将值返回给 ajax。大家怎么看?

                 <script>
            $('#quizform').submit(function() {
            var data = $(this).serializeArray();
            count = 0;
            $.each(data, function(i, el) {
                //display the key and value pair
                var k = el.name;
                 var v = el.value;
                 var request = $.ajax({
                        url: "checkanswer.php",
                        type: "POST",
                        data:{ k:k, v:v},
                        dataType:"text",

                   success: function(data) { 
                   if (data=="correct") {
                    count++;

                   } 
                   },
                   error: function(request, err){ 

                  alert(err);

                   }
                 });

});
            alert(count);
             return false;
});

            </script>

PHP脚本:

    <?php
session_start();
include_once("config.php");
if (isset($_POST['k']) && isset($_POST['v'])){
    $questionid=$_POST['k'];
    $option=$_POST['v'];
    $result=mysqli_query($mysqli, "SELECT COUNT(*) FROM answer WHERE question_id = ".$questionid." AND optionid = ".$option."");
    if($result==0) {
        echo"wrong";
    }else if ($result == 1) {
        echo"correct";
    }

}
?>

我已经编辑了上面的代码

json是一个

字符串。要$.each()的参数必须是数组或对象。您无需创建 JSON 字符串,只需直接遍历obj

$.each(obj, function(k, v) {
    ...
});

实际上,也没有理由创建obj,只需循环data

$.each(data, function(i, el)
    var k = el.name;
    var v = el.value;
    ...
});

最后,这不会是 JSON。 $.ajax使用x-www-form-urlencoded格式,PHP 会自动解码。所以你不应该在 PHP 中使用json_decode()

在我看来,您的代码格式不正确,您也应该使用HTML显示完整代码,我也不知道为什么要制作问题ID数组,如果它们可以发送到服务器而不用元素的维度数组循环它们。

并在 mysql 中使用 IN 运算符,就像使用 json_decode() 返回数组或对象一样,因此请尝试您的查询,例如,

$result=mysqli_query($mysqli, "SELECT COUNT(*) FROM answer WHERE question_id IN (".$questionid.") AND optionid IN (".$option.")");

例如,你必须questionid as array of html elements然后在ajax中传递它,就像,

$('#form').on('submit',function(e){
    e.preventDefault();
    var data=$(this).serialize();
    $.ajax({...});/// using post method
    return false;
});

php-mysql query使用它时,

$sqlQuery = "SELECT COUNT(*) FROM answer WHERE question_id IN (".implode(',',$_POST['questionid'].") ";

你似乎对javascript的异步行为有问题。您无法猜测代码中count增量何时完成,因为ajax调用是异步的。

而是使用 jQuery.when() 来确定所有 ajax 调用何时完成,并在完成后使用 count 变量。

var count = 0;
var ajaxCalls = [];
$.each(data, function(i, el) {
    //display the key and value pair
    var k = el.name;
    var v = el.value;
    ajaxCalls.push($.ajax({
                    url: "checkanswer.php",
                    type: "POST",
                    data:{ k:k, v:v},
                    dataType:"text",
                    success: function(data) { 
                      if (data=="correct") {
                        count++;
                      } 
                    },
                    error: function(request, err){ 
                            alert(err);
                    }
                  }));
});
$.when.apply(null, ajaxCalls ).done(function () { alert(count);});