MySQL中的AJAX插入延迟-不插入


AJAX insert in MySQL delay - non inserting

我正在编程一种池应用程序-我有大约50个div-1显示,49隐藏。在每个div中都有一个带有单选按钮的表单,在用户点击单选按钮后,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;
}

}

打印json_encode($resp);

至少应该显示警报,对吧?但它不是。。。谢谢你,

Tomáš

将您的警报更改为

alert('Answer wasn''t stored');

或者,

alert("Answer wasn't stored");

尝试ajax选项中的选项async: false

http://api.jquery.com/jquery.ajax/

正如选项名称所说,make asynchronous false,即它将等待ajax完成,然后再显示下一个div/元素(无论成功与否)。

好吧,我自己找到了解决方案。

当其中一个按钮被点击时,我没有禁用它。正因为如此,另一个AJAX函数被调用并中断了前一个。

现在,当我在点击后禁用按钮,并在ajax成功后启用它们时,一切都很好。

谢谢你的帮助。