繁体   English   中英

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

[英]Why isn't this AJAX call executing properly?

我正在建立一个网站,该网站根据用户可以输入的促销代码提供折扣。 在处理新注册之前,我有必要验证代码是否存在于我们的数据库中。 这是我用于验证的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:”行,这使我认为我的代码存在一些可怕的错误,但是我一生都无法找出原因。 谢谢你的帮助!

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


另外, 您尝试在设置JS returned变量之前读取它的值

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

第二:

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

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

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

这是一个摆弄异步UI内容的示例: https : //jsfiddle.net/xpvt214o/663873/

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

希望这对某人有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM