2

我在页面上有一个 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 和 $Page 一样在 init.php 中初始化。

这段代码一直运行到今天我再次测试它。它应该将数据发布到 schoolProfile.saveEsign.php 并运行一个函数来将 schoolID 和签名保存到 mysql 数据库。

我使用了 javascript alert() 函数来发布“响应”的结果,它总是显示整个当前页面 (schoolProfile.edit.php) 的代码。

我在 Chrome 中运行了代码,它显示数据正在发布。它的状态为 302 - 已找到。大小为 485 B(对于只有文本的 2 个变量听起来很合理),但 Chrome 网络调试器中的大小下方是内容,内容为 0 B - 空。我不知道这是否意味着数据没有被发送或什么。

我已经测试了设置 Session 变量以查看会话是否被保存并且我无法更改它的值,因此这可能表明数据实际上没有被推送。但是当我查看被调用页面的标题时,它会显示 2 个变量——schoolID 和签名——以及值。

我是 Chrome 网络调试器的新手,所以如果有任何其他事情我可以检查,或者如果有人有任何建议,我们将不胜感激。

编辑:我还测试了 ajax 调用中的成功和错误函数,并且总是调用成功。再次,它只返回当前页面的整个代码 (schoolProfile.edit.php)。

4

1 回答 1

0

我发现了这个问题。在我include($_SERVER['DOCUMENT_ROOT'] . '/includes/init.php');的 init.php 文档中,如果用户尚未完成填写学校资料,它会将用户重定向到 schoolProfile.edit.php,并且它还确保他们尚未使用 PHP 的$_SERVER['REQUEST_URI'].

问题是,当尝试调用 schoolProfile.saveEsign.php 时,此 URL 不在正常 URL 的“列表”中,因此 AJAX 请求总是被重定向到 schoolProfile.edit.php - 也就是当前页面。这就是为什么我在发出警报时总是会看到当前页面代码的原因。

供自己以后参考。原始代码:

if($_SERVER['REQUEST_URI'] != '/settings/schoolProfile.edit?f='.$Main->encrypt("INCOMPLETE")) {
   header("Location:/settings/schoolProfile.edit?f=".$Main->encrypt("INCOMPLETE"));
   exit();
}

固定代码:

if($_SERVER['REQUEST_URI'] != '/settings/schoolProfile.edit?f='.$Main->encrypt("INCOMPLETE")
   && $_SERVER['REQUEST_URI'] != '/settings/bin/schoolProfile.saveEsign'
   && $_SERVER['REQUEST_URI'] != '/settings/bin/schoolProfile.saveEsign.php') {
  header("Location:/settings/schoolProfile.edit?f=".$Main->encrypt("INCOMPLETE"));
  exit();
}
于 2013-09-16T21:45:32.997 回答