我正在编写一种池应用程序 - 我有大约50个div - 1个显示,49个隐藏。在每个div中都有一个带有radiobutton的表单,用户点击radiobutton后,JS调用AJAX - PHP请求并将答案插入MySQL。成功后,显示下一个div等等......
一切正常,直到我回答得更快 - 大约3个问题/秒。
然后一些答案停止存储。例如,存储1,2,4,6,7,10的答案。 3,5,8,9失踪了......
我怎么能避免它?在答案中保持一致是非常重要的。
这是我的JS
$('input[type=radio]').click(function () {
$.ajax({
url: 'assets/ajax/save_answer.php',
data: {action: 'save_answer', question: currentQuestion, answer: $('input[name=answer-' + currentQuestion + ']:checked').val(), answer_pattern: 'agree-disagree', seconds: currentTime},
type: 'post',
dataType: 'json',
success: function (output) {
if (output.success) {
$('.loading img').css("display", "none");
$('#' + currentQuestion).remove();
currentQuestion += currentQuestion;
$('#' + currentQuestion).show();
} else {
alert("Answer wasn't stored");
$('.loading img').css("display", "none");
}
},
error: function () {
alert("Answer wasn't stored");
$('.loading img').css("display", "none");
}
});
PHP函数
if (isset($_POST['action']) && $_POST['action'] == "save_answer") {
$resp = new stdClass();
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$user = $purifier->purify($_SESSION['user_id']);
$projekt = $purifier->purify($_SESSION['projekt_id']);
$otazka = $purifier->purify($_POST['question']);
$odpoved = $purifier->purify($_POST['answer']);
$answer_pattern = $purifier->purify($_POST['answer_pattern']);
$seconds = $purifier->purify($_POST['seconds']);
if(check_answer($answer_pattern, $odpoved)){
$stmt = $db->prepare("SELECT * FROM odpovedi WHERE uzivatel = :uzivatel AND projekt = :projekt AND otazka = :otazka");
$stmt->bindParam(':uzivatel', $user);
$stmt->bindParam(':projekt', $projekt);
$stmt->bindParam(':otazka', $otazka);
$stmt->execute();
$answers_count = count($stmt->fetchAll());
if ($answers_count != 1) {
$stmt = $db->prepare("INSERT INTO odpovedi (uzivatel, projekt, otazka, odpoved, seconds) VALUES (:uzivatel, :projekt, :otazka, :odpoved, :seconds) ");
$stmt->bindParam(':uzivatel', $user);
$stmt->bindParam(':projekt', $projekt);
$stmt->bindParam(':otazka', $otazka);
$stmt->bindParam(':odpoved', $odpoved);
$stmt->bindParam(':seconds', $seconds);
$stmt->execute();
$stmt = $db->prepare("SELECT * FROM odpovedi WHERE uzivatel = :uzivatel AND projekt = :projekt AND otazka = :otazka");
$stmt->bindParam(':uzivatel', $user);
$stmt->bindParam(':projekt', $projekt);
$stmt->bindParam(':otazka', $otazka);
$stmt->execute();
$answer_inserted = count($stmt->fetchAll());
if ($answer_inserted < 1) {
$resp->success = false;
} else {
$resp->success = true;
}
}else{
$resp->success = true;
}
}else{
$resp->success = false;
}
}
print json_encode($ resp);
至少应该显示警报,对吧?但它不是...... 谢谢,
托马什
答案 0 :(得分:1)
将您的提醒更改为
alert('Answer wasn\'t stored');
,或者
alert("Answer wasn't stored");
答案 1 :(得分:0)
在ajax选项中尝试选项async: false
。
http://api.jquery.com/jquery.ajax/
由于选项名称表示make asynchronous为false,即它会在显示下一个div / element之前等待ajax完成(无论你的成功是什么)。
答案 2 :(得分:0)
好吧,我自己找到了解决方案。
当点击其中一个时,我没有禁用无线电按钮。因此 - 另一个AJAX函数被调用并中断了前一个函数。
现在当我在点击后禁用按钮并在ajax成功后启用它们一切都很好。
感谢您的帮助。