使用Jquery post时PHP不会重定向

时间:2013-01-29 03:01:30

标签: php jquery

  

可能重复:
  How to manage a redirect request after a jQuery Ajax call

我有一个使用Jquery在客户端验证的表单。然后,Jquery将此数据传递给php脚本以进行服务器端验证。在PHP脚本的最后,我尝试重定向成功,但没有重新指向发生。

Jquery是否干扰了重定向?如何让php脚本重定向?不想使用jquery重定向,bc我将使用会话并希望将会话数据保留在重定向。

以下是代码:

JQUERY:

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //POST method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.

                        if(data == "fail"){
                            $("#statusMessage").html("");
                            $("#statusMessage").html("<p class='statusBoxWarning'>Username and password do not match!</p>");
                            $('button').removeAttr('disabled');
                            document.forms[0].reset();
                        }                               
                    }
                }); 

PHP

if($correctPass == 1){
ob_start();
session_start();
$_SESSION['usernameIdentity'] = $userName;
unset($userName, $userPass);
header("Location: ../../adminDashboard.html");
exit;
}else{
echo "fail";
}

php脚本进入重定向部分并挂起。我真的想保持jquery功能,以及php重定向。有更好的方法吗?

谢谢!

                              FINAL WORKING SOLUTION:

好的,在这篇文章和其他类似帖子的输入之后,这就是我的工作解决方案。它可能不是最有效或最漂亮的解决方案,但它起作用,现在必须要做。

JQUERY

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //GET method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.
                        if(data == "success"){
                            $('#statusMessage').html('<form action="http://www.example.com/test/userRegistration/adminDashboard.html" name="userSubscription" method="post" style="display:none;"><input type="text" name="username" value="' + reg_contact_username + '" /><input type="text" name="password" value="' + reg_contact_password + '" /></form>');
                            document.forms['userSubscription'].submit();
                        }else{alert("couldn t redirect");}                              

                    }
                }); 

PHP

if($correctPass == 1){
echo "success";
}else{
echo "fail";
}

接收重定向页面必须再次验证用户名和密码,因此验证将完成2次...这实在是效率低下。如果有人能为我提供更好的解决方案 - 请!写出来的样本也会有所帮助。

谢谢!

3 个答案:

答案 0 :(得分:5)

由于AJAX发生在“幕后”(可以这么说),你的重定向只会中断对你的javascript处理程序的响应。

您需要返回该网址,并让您的回调将浏览器踢到新位置。

更新

在此注释中,由于您必须将数据返回到前端,因此您需要添加status或类似变量,以便根据呼叫是否“失败”切换前端行为或不。

更新2:

为了回应您的解决方案,我强烈建议您不要使用表单提交技术。正如你所说,它效率不高,不漂亮,需要两倍的工作(验证用户2次)。

如果用户成功登录,为什么不使用PHP的内置session handling来设置会话,然后只需在简单的javascript浏览器重定向后检查会话?

javascript重定向就像window.href = "http://mylocation"一样简单,如果你对PHP的会话知之甚少,你可以使用this class我已经建立了(请忽略它也在管理cookie,这是愚蠢的疏忽)。

答案 1 :(得分:1)

你在哪里刷新输出缓冲区?尝试在ob_end_flush();重定向后添加header(),看看是否有效。

修改 将您的相对URI转换为绝对URI可能会解决您的问题。这是直接从php.net中提取的一般示例。它创建了一个基于相对URI的绝对URI - 你总是可以对绝对URI进行硬编码而不是这样做。

<?php
  /* Redirect to a different page in the current directory that was requested */
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  $extra = 'mypage.php';
  header("Location: http://$host$uri/$extra");
  exit;
?>

答案 2 :(得分:0)

尝试在AJAX调用中使用完整的URL。

而不是:

    url: "includes/process/processAdminLogin.php",

尝试:

    url: "http://www.mysite.com/includes/process/processAdminLogin.php",