我在页面上有一个AJAX调用,供管理员进行电子签名。当按下一个按钮(adminEsign_btn)时,会调用此jQuery:
$("#adminEsign_btn").click(function(e){//admin esign submitted
e.preventDefault();
//validate esign
var valid = true;
if($.trim($('#adminSignature').val()).length < 3){
valid = false;
}
//action
if(valid === false){
$('#adminEsignError').html('<span class="error">You must agree to the statement and sign.</span>');
}
else{//validation passed, submit data
var schoolID = <?php echo $schoolProfile['schoolID']; ?>;
var signature = $('#adminSignature').val();
$('#adminEsignLoader').css({'display':'inline-block'});
$('#submitForm').attr("disabled","disabled");
$('#submitForm').val("Updating...");
$.ajax({
type: "POST",
url: 'bin/schoolProfile.saveEsign.php',
data: { schoolID:schoolID, signature:signature}
}).done(function(response) {
//$('#debug').html(response);
//alert(response);
if(response.indexOf('success') >= 0){//if 'success' exists in the response text
$('#submitForm').removeAttr("disabled");
$('#submitForm').val("Update School Profile");
$('#adminEsignLoader').hide();
//disable the e-sign
$('#adminAgree').attr("disabled","disabled");
$('#adminSignature').attr("readonly","readonly");
$('#adminEsign_btn').attr("disabled","disabled");
}
});
$('#adminEsignError').html('');
}
});
我没有写原始代码,所以我不确切知道if语句中发生了什么:
if(response.indexOf('success') >= 0){//if 'success' exists in the response text
但是,除了成功的回声之外,这个电话并不期待回归。以下php页面(schoolProfile.saveEsign.php)就是所谓的:
<?php
include($_SERVER['DOCUMENT_ROOT'] . '/includes/init.php');
$Page->clearance('Admin');
$Main->saveSchoolAdminEsign($_POST['schoolID'], $_POST['signature']);
echo 'success';
?>
注意:$ Main在init.php中初始化,也是$ Page。
此代码一直运行到今天,当我再次测试它时。它应该将数据发布到schoolProfile.saveEsign.php并运行一个函数将schoolID和签名保存到mysql数据库。
我使用javascript alert()函数发布“响应”的结果,它总是显示整个当前页面的代码(schoolProfile.edit.php)。
我在Chrome中运行代码并显示数据正在发布。它的状态为302 - Found。大小为485 B(对于仅包含文本的2个变量听起来合理),但Chrome网络调试器中的大小是内容,内容是0 B - 空。我不知道这是否意味着数据没有被发送或是什么。
我已经测试过设置Session变量以查看会话是否已保存,而我无法更改其值,这可能表示数据实际上并未被推送。但是当我查看被调用页面的标题时,它会显示2个变量 - schoolID和signature - 以及值。
我是Chrome网络调试器的新手,所以如果还有其他任何我可以查看的内容,或者是否有人有任何建议,我们将不胜感激。
编辑:我还测试了ajax调用中的成功和错误函数,并且总是调用成功。它再一次只返回当前页面的整个代码(schoolProfile.edit.php)。
答案 0 :(得分:0)
我发现了这个问题。在我的include($_SERVER['DOCUMENT_ROOT'] . '/includes/init.php');
中,init.php文件将用户重定向到schoolProfile.edit.php,如果他们还没有填写学校档案,并且还确保他们不在使用PHP {{{ 1}}。
问题在于,当试图调用schoolProfile.saveEsign.php时,此url不在okay'd URL的“列表”中,因此AJAX请求始终被重定向到schoolProfile.edit.php - AKA当前页面。这就是为什么我会在发出警报时始终看到当前的页面代码。
供我自己参考。原始代码:
$_SERVER['REQUEST_URI']
固定代码:
if($_SERVER['REQUEST_URI'] != '/settings/schoolProfile.edit?f='.$Main->encrypt("INCOMPLETE")) {
header("Location:/settings/schoolProfile.edit?f=".$Main->encrypt("INCOMPLETE"));
exit();
}