【问题标题】:PHP not redirecting when working with Jquery post [duplicate]使用Jquery post时PHP不重定向[重复]
【发布时间】:2013-01-12 13:18:03
【问题描述】:

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

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

Jquery 会干扰重定向吗?如何让 php 脚本重定向。不想用 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 次......这确实是低效的。如果有人可以为我提供更好的解决方案 - 请!写出样本也会有所帮助。

谢谢!

【问题讨论】:

    标签: php jquery


    【解决方案1】:

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

    您需要返回 URL 并让您的回调将浏览器踢到新位置。

    更新:

    在此说明中,由于您必须将数据返回到前端,因此您需要添加 status 或类似变量,以便您可以根据调用是否“失败”来切换前端行为.

    更新 2:

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

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

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

    【讨论】:

    • 我正在考虑“状态”变量,您指的是实施类似于上面可能的内容重复链接中看到的解决方案(“如何管理重定向...”),对吗?
    • 是的,非常相似。我非常喜欢创建 PHP stdClass 对象,然后 json_encode 他们在前端创建一个漂亮的 javascript 对象。
    • 感谢您的意见。我将按照您的建议实施该方法。
    【解决方案2】:

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

    代替:

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

    试试:

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

    【讨论】:

    • 试过这个。没用。
    【解决方案3】:

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

    编辑: 也许将您的相对 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;
    ?>
    

    【讨论】:

    • 直接引用自 php.net: "注意:HTTP/1.1 需要一个绝对 URI 作为 » Location 的参数:包括方案、主机名和绝对路径,但有些客户端接受相对 URI。您通常可以使用 $_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF'] 和 dirname() 自己从相对的 URI 中创建绝对 URI"
    • 缓冲区在exit;上被隐式刷新
    • @Jack 有趣...不知道!
    • 不,它不起作用。我认为 Rockerest 是对的……我需要用 jquery 实现重定向……但随之而来的问题是如何保持会话数据处于活动状态……呃!
    • 是的,我认为 Rockerest 也是对的。我只是自己尝试了一下,结果是重定向页面的内容作为数据参数被发送回 jQuery 的成功函数。如果您 console.log() 成功函数中的数据参数,您应该能够看到“adminDashboard.html”页面上的内容。所以从技术上讲,它正在重定向(我猜),只是重定向页面的内容回到了 JavaScript ......如果你考虑一下,这是有道理的。希望对您有所帮助!
    猜你喜欢
    • 2011-10-11
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多