我正在建立一个网站,该网站根据用户可以选择输入的促销代码提供折扣。在处理新注册之前,我有必要验证代码是否存在于我们的数据库中。这是我用于验证的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:”行,这使我认为我的代码存在一些可怕的错误,但是我一生都无法找出原因。感谢您的帮助!
答案 0 :(得分:3)
return
不会导致PHP程序写入输出。为此,您需要echo
或print
。
还有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;
}
希望这对某人有帮助!