繁体   English   中英

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返回文本字符串“正确”,然后将其递增1到创建的count变量。 我还附加了以下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()

您似乎对javascript的异步行为有疑问。 由于ajax调用是异步的,因此您无法猜测代码中的count增量何时结束。

而是使用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);});

我认为您的代码格式不正确,您也应该使用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'].") ";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM