【问题标题】:Why isn't this AJAX call executing properly?为什么这个 AJAX 调用没有正确执行?
【发布时间】:2018-08-21 08:57:17
【问题描述】:

我正在构建一个网站,该网站根据用户可以选择输入的促销代码提供折扣。在处理新注册之前,我有必要验证代码是否存在于我们的数据库中。这是我用于验证的 AJAX 调用:

if (promo_code) {
    var returned = true;
    $.ajax({
        type:    "POST",
        url:     "/ajax/validate_promo_code.php",
        data:    {promo_code: promo_code},
        success: function(result) {
            if (result == 0) {
                $('#blank_dialog_popup').html('<span class="message_text_big">Sorry, that promo code is not valid.</span>').addClass('message_warning').css('display', 'block').css('z-index', '1003');
                setTimeout(returnMessageBackground, 3000);
                $('#promo_code').focus();
                returned = false;
            }
        }
    });
    if (returned != true) {
        return false;
    }
}

这是我用于验证的整个 PHP 文件。

<?php
//ini_set('display_errors',1);
//error_reporting(E_ALL|E_STRICT);
    $db = new Database();
    $promo_code = filter_var(intval($_POST['promo_code']), FILTER_VALIDATE_STRING);
    $check_query = "SELECT id FROM users WHERE promo_code = '$promo_code'";
    $db->query($check_query);
    if ($db->num_rows != 1) {
        return 0;
    } else {
        return 1;
    }
?>

即使我注释掉 PHP 文件中除了“return 0;”之外的每一行代码,success 字段也不会执行并摆脱 AJAX 调用中的“数据:”行,这让我觉得我的代码有一些可怕的问题,但我一生都无法弄清楚是什么。感谢您的帮助!

【问题讨论】:

  • 另外,我希望没有人使用过以下促销代码:1\'; DELETE FROM users; 请阅读有关保护您的应用程序免受 MySQL 注入的信息。 stackoverflow.com/questions/60174/…

标签: javascript php ajax post


【解决方案1】:

return 不会导致 PHP 程序写入输出。为此,您需要 echoprint


另外,you are trying to read the value of your JS returned variable before you set it

【讨论】:

  • 谢谢!那么,忽略异步问题,将 PHP 文件中的 return 语句更改为 echo 或 print 会满足我的需求吗?
【解决方案2】:

首先正如@Quentin 所说,您需要使用 echo 或 print。

第二:

AJAX 请求为 aysnc。这意味着代码没有按顺序执行,但稍后会调用 success() 函数(在服务器响应之后)。我的意思是这部分

if (returned != true) {
    return false;
}

将永远不会执行,因为您正在更改仅异步执行的 success() 方法中的 returned 的值。

这是一个如何异步操作 UI 内容的示例:https://jsfiddle.net/xpvt214o/663873/

【讨论】:

  • 明白了。我现在看到,这是很多不了解异步的人提出的一个非常普遍的问题。任何解决方法的建议?除了返回语句之外,代码现在可以正常工作,我很难理解 Quentin 发送的链接。
【解决方案3】:

所以我通过大量研究发现这段代码存在一些问题。主要的一个是我需要使用“async:false”来使 AJAX 调用异步。我很难理解@Quentin 链接中的解决方案。我已经更改了下面的一些内容,使其更简洁明了,但这是该函数的最终工作版本。

// Validate promo code, if present.
if (promo_code) {
    var flag = 1;
    $.ajax({
        type:    "POST",
        url:     "/ajax/validate_promo_code.php",
        data:    {promo_code: promo_code},
        async:   false,
        success: function(data) {
            if (data == 0) {
                $('#blank_dialog_popup').html('<span class="message_text_big">Sorry, that promo code is not valid.</span>').addClass('message_warning').css('display', 'block').css('z-index', '1003');
                setTimeout(returnMessageBackground, 3000);
                $('#promo_code').focus();
                flag = 0;
            }
        }
    });
    if (flag == 0) {
        return false;
    }
}

这是主要问题,但我的 PHP 代码中也有一些错误。首先,我需要包含创建数据库类的代码。其次,我必须更有效地清理我的字符串输入。第三,我的 SQL 查询没有按照我的预期获取包含促销代码的每一行。最后,我不需要 return 语句中包含任何逻辑。这是最终版本。

require_once('../smarty/Authenticate.inc.php');

$db = new Database();
$promo_code = StringInputCleaner($_POST['promo_code']);
$check_query = "SELECT * FROM users WHERE promo_code = '$promo_code'";
$db->query($check_query);
$return = $db->num_rows;

echo $return;

function StringInputCleaner($data) {
    //remove space before and after
    $data = trim($data); 
    //remove slashes
    $data = stripslashes($data); 
    $data = (filter_var($data, FILTER_SANITIZE_STRING));
    return $data;
}

希望这对某人有所帮助!

【讨论】:

  • 使用async: false 是非常糟糕的做法。但在你的情况下,我理解你使用它,因为它有助于你进步。无论如何,您应该尝试修复您的 javascript 代码以能够处理异步。
  • 这是一个如何异步操作 UI 内容的示例:jsfiddle.net/xpvt214o/663873
  • 我的朋友,这实在是太过分了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多