【问题标题】:PHP header() doesnt redirects after ajax is called调用 ajax 后 PHP header() 不重定向
【发布时间】:2014-01-07 15:30:43
【问题描述】:

我正在使用 ajax 插入数据。注册成功后,它将重定向到其注册表页面或registry.php。但似乎它没有重定向到其各自的页面,奇怪的是当我在 Firefox 上的控制台上检查它时,它似乎给出了正确的结果,类似于 POST xxxx/form_zuri/insertData.php 302 Found 50 毫秒和 GET xxxx/form_zuri/registry.php 302 找到 37 毫秒。

这里是 insertData.php 的代码

    if($data = $admin->insertRegistrantInfo($fname, $lname, $aname, $email, $password) == true) {
    session_regenerate_id(true);// destroying the old session id and creating a new one
    $_SESSION['id'] =  $data;
    header('location: registry.php');
    exit();

这是我的 ajax 脚本:

$("#submit_third").click(function(){


    $.ajax({
        type: "POST",
        url: "insertData.php",
        data: {

            fname                       : $("#fname").val(),
            lname                       : $("#lname").val(),
            aname                       : $("#aname").val(),                
            email                       : $("#email").val(),
            password                    : $("#password").val()              

            },
        cache: false,
        success: function(data) {

        //window.location.replace('registry.php') ;   

        }
    });
    //window.location.replace('registry.php') ;  
    //return false;

});

如果我将使用 .replace js 函数,它将无法获取 SESSION ID。

有什么想法吗?

【问题讨论】:

  • 不,您不能像那样重定向,您需要向您的响应发送一个 id,并且在该响应上,您需要在 ajax 响应中检查该 id,在本节中,您将使用 jquery 重定向您的页面.
  • 这正是我想要的!你是如何解决这个问题的@user3052545

标签: php ajax


【解决方案1】:

当您在 AJAX 中调用 PHP 脚本时,请求是由 AJAX 调用执行的,而不是客户端所在的当前页面,因此它不会更改实际正在查看的页面上的标题 - 仅在AJAX 调用的响应。在这种情况下,它不会做你想要的。

此外,当内容已经输出时,您无法更改标题,在您的情况下,它会再次输出。

如果您在 AJAX 回调中使用 window.location.href = 'registry.php',则会话 ID 应该在那里。使用window.location.replace 不会在您的历史记录中添加新记录。

【讨论】:

  • 感谢@Stanyer 的回答,但它给了我错误 TypeError: window.location.href is not a function window.location.href('registry.php') ;
  • window.location.href 是要在 AJAX 回调中调用的 JavaScript 函数,您当前已将 window.location.replace 注释掉。
  • 我实际使用了window.location.href
  • 如另一个答案中所述,尝试location.reload();之后。
【解决方案2】:

另一种方法是创建另一个会话 ID,例如 $_SESSION["passed"] = true;然后在成功插入数据后,您可以刷新当前页面,并且仍然使用 header 方法。

php代码

if (isset($_SESSION["passed"])){
if ($_SESSION["passed"]) header('location: registry.php');
}

在 javascript 端,您可以在成功查询后重新加载

location.reload();

【讨论】:

  • codeif($data = $admin->getSessionID($email) == true); $_SESSION['id'] = $data; header('位置:registry.php');出口();我添加了这个并添加了重新加载功能,它再次将我重定向到表单本身..
  • 你在哪里放置了标题语句,标题语句必须在任何输出到屏幕之前,否则它将不起作用。
  • 什么意思?if($data = $admin->insertRegistrantInfo($fname, $lname, $aname, $email, $password) == true) { session_regenerate_id(true);/ / 销毁旧的会话 id 并创建一个新的 $_SESSION['id'] = $data; header('位置:registry.php');退出();
【解决方案3】:

您不能在 php 文件中以这种方式重定向。您需要设置任何变量作为响应 并且在您的 ajax 成功框中,您可以检查该特定值是否设置 您将使用 Jquery 重定向您的页面。

而且我认为它不会在 SESSION 中造成任何问题,您必须在页面标题上调用 session_start()。

【讨论】:

  • 尝试 print_r($_SESSION);$_SESSION['id'] = $data; 后退出此代码并检查会话值设置是否完美。还要检查您的重定向代码,它必须是 window.location.href='registry.php';
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多