Javascript 为什么不是';这个AJAX调用不能正常执行吗?

Javascript 为什么不是';这个AJAX调用不能正常执行吗?,javascript,php,ajax,post,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},

我正在建立一个网站,根据用户可以选择输入的促销代码提供折扣。在处理新注册之前,我有必要验证数据库中是否存在代码。下面是我用于验证的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;
    }
}
if(促销代码){
返回的var=true;
$.ajax({
类型:“POST”,
url:“/ajax/validate\u promo\u code.php”,
数据:{promo_code:promo_code},
成功:功能(结果){
如果(结果==0){
$(“#空白对话框\弹出窗口”).html('抱歉,该促销代码无效').addClass('消息\警告').css('display','block').css('z-index','1003');
setTimeout(returnMessageBackground,3000);
$(“#促销代码”).focus();
返回=假;
}
}
});
如果(返回!=true){
返回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程序写入输出。你需要或为此



另外,.

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

第二:

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

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


下面是一个如何异步操作UI的例子:

因此,我通过大量研究发现,这段代码存在一些问题。主要的一点是,我需要使用“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;
    }
}

希望这对某人有帮助

此外,我希望没有人使用过以下促销代码:
1\;从用户中删除请阅读有关保护您的应用程序免受MySQL注入的内容。谢谢因此,忽略异步问题,将PHP文件中的return语句更改为echo或print将提供我所需要的内容?明白了。我现在明白了,这是一个非常常见的问题,很多人都不了解异步。有什么解决办法的建议吗?除了return语句之外,代码现在工作正常,我很难理解Quentin发送的链接。使用
async:false
确实是一种糟糕的做法。但在你的情况下,我不理解你使用它,因为它有助于你进步。无论如何,您都应该尝试修复javascript代码,使其能够处理异步。非常感谢。
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;
}