有时需要两次提交(AJAX 调用)来保存数据


Sometimes two submits (AJAX calls) are required to save data

我目前正在为我的网站构建一个多项选择测验模块。有一个包含 20 个问题的列表,这些问题只能由登录的客户回答。

我有三张桌子:

表问题, 带有字段 questions.id, 问题。说明

表选项,包含字段 options.id, 选项.问题ID, 选项.trueorfalse

表答案,包含字段 answers.id、答案.客户ID、答案.问题ID、答案.选择选项

这些问题通过 ajax-call 随机出现,因此仅显示客户未回答的问题。回答完所有问题后,最终分数就会得到回响。

有人可以帮助我使用正确的sql语句,php脚本应该运行以显示客户尚未回答的问题吗?

目前它似乎有效,但我有时必须提交两次相同的答案。实际上第一次发送 aleady,但 ajax 调用显示相同的问题。

这是我使用的 sql 语句...

SELECT * from questions
where  not exists (
select answers.questionid from answers
where answers.questionid = questions.id 
and answers.customerid = '".$customerid."' )
order by rand()
limit 1"

数据由JQuery帖子发送(运行良好)。页面内部quiz_ajax.php

<script type="text/javascript">
$(document).ready(function(){
$("#ajax-post-answer").submit(function(){
var str = $(this).serialize();
$.ajax({
type: "POST",
url: "answerswerpost.php",
data: str
 });
callquiz();
return false;
});
});
</script>

在页面测验内.php(主页)

<script type="text/javascript"> 
function callquiz()
{
var newDate = new Date;
$.ajax({
method: 'POST',
url : 'quiz_ajax.php?'  + newDate.getTime(),
dataType : 'text',
success: function (text) { 
$('#updateMequiz').html(text); }
});
}
callquiz();
</script> 
<div id="updateMequiz"></div>

所以函数调用测验,应该用一个新问题刷新这个div。我现在正在调查这个问题 24 小时,所以我很好奇听听我做错了什么。

提前感谢!!

这个问题可能与HTTP/AJAX的异步性质有关:仅仅因为请求已被"放在网络上"并不意味着它实际上已被服务器处理 - 更不用说保存到数据库中了!

作为快速检查,将callquiz()$.submit回调移动到"answerswerpost.php"$.ajax回调的成功回调。(也就是说,仅在提交问题答案的请求完成后请求新信息。

这将确保"更新"(answerpost.php)操作在下一个"获取测验"(quiz_ajax.php)请求之前发生(并完成)。如果确实如此,请考虑让"更新"也返回"获取测验"信息以进行单个统一调用。