【问题标题】:AJAX insert in MySQL delay - non insertingMySQL延迟中的AJAX插入-非插入
【发布时间】:2015-06-27 09:23:04
【问题描述】:

我正在编写一种池应用程序 - 我有大约 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);

至少应该显示警报,对吗?但它不是... 谢谢,

托马什

【问题讨论】:

  • 用php代码更新你的问题
  • 注意:使用alert("Answer wasn't stored");
  • 你应该在alert函数中转义单引号字符:alert('Answer wasn\'t stored');
  • 对,我在页面上编辑了警报,因为我来自捷克共和国并且警报在我的语言中,所以我这样做只是为了清晰。
  • 首先你必须看到它失败的地方,所以在每一步添加错误报告: if ($stmt = $db->prepare()) { if ($stmt->bindparam( 你可以绑定所有这些都在同一时间)) { if ($stmt->execute()) { echo 'Success!' } else { echo $db->e​​rror, E_USER_ERROR; } 回声 $db-> 错误,E_USER_ERROR; } else { echo $db->e​​rror, E_USER_ERROR; }

标签: javascript php jquery mysql ajax


【解决方案1】:

将您的警报更改为

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

或者,

alert("Answer wasn't stored");

【讨论】:

  • 我知道,在我的原始代码中,它就像你写的那样。这只是页面上的一个错字,我将警报翻译成英文
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    嗯,我自己找到了解决办法。

    单击其中一个时,我没有禁用单选按钮。因此 - 另一个 AJAX 函数被调用并中断了前一个。

    现在,当我在单击后禁用按钮并在 ajax 成功后启用它们时一切正常。

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2012-09-15
      相关资源
      最近更新 更多