为什么此AJAX调用无法正确执行?

时间:2018-08-21 08:57:18

标签: javascript php ajax post

我正在建立一个网站,该网站根据用户可以选择输入的促销代码提供折扣。在处理新注册之前,我有必要验证代码是否存在于我们的数据库中。这是我用于验证的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;”之外的每一行代码,成功字段也不会执行。并摆脱了AJAX调用中的“ data:”行,这使我认为我的代码存在一些可怕的错误,但是我一生都无法找出原因。感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

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


还有you are trying to read the value of your JS returned variable before you set it

答案 1 :(得分:1)

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

第二:

将AJAX请求作为aysnc。这意味着未按顺序执行代码,但稍后(在服务器响应之后)调用[[0 0 1303] [0 0 0] [0 0 0] [1303 0 0] [0 0 0] [0 1303 0] [0 0 0] [0 0 1303]] 函数。我的意思是这部分

success()

将永远不会执行,因为您正在if (returned != true) { return false; } 方法中更改returned的值,该方法仅异步执行。

下面是一个示例,其中显示了如何异步操作UI内容:https://jsfiddle.net/xpvt214o/663873/

答案 2 :(得分:0)

因此,通过大量研究我发现了此代码的一些问题。主要的问题是我需要使用“ 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代码中也有一些错误。首先,我需要包含创建Database类的代码。其次,我必须更有效地清理字符串输入。第三,我的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;
}

希望这对某人有帮助!