提交表单后,错误地将用户重定向回PHP页面

时间:2010-10-06 23:24:22

标签: php html forms

所有

这个问题可能有一个非常简单的答案 - 我忽视了一些问题。但也许有人可以告诉我在哪里看......

我有一个PHP页面(“index.php”),其中包含一个非常简单的登录表单(例如,用户名和密码)。

当用户单击“提交”按钮时,表单将值POST到另一个PHP页面(“login.php”)。该页面应该确认用户的凭据,然后执行以下操作:

  • 如果用户的凭据不是 更正,将用户重定向到 error.php,以及错误 消息
  • 如果用户的凭据是 更正,创建一个会话并设置$ _SESSION ['authenticated'] = true,然后将他重定向到“loggedin.php”

[UPDATE]

然后,在loggedin.php上,我检查看到isset($ _ SESSION ['authenticated'])返回true。如果是,则继续。如果没有,请将用户重定向回index.php。

然而,这是发生的事情。 FIRST 时间我填写表单(有效的信用卡)并提交它,我可以在URL栏中简要地看到用户被发送到login.php,然后是loggedin.php,但是< strong> BACK 到index.php。

但是,如果我重新输入相同的凭据并将信息提交 SECOND 时间,那么一切都会完全正常。

因此,简而言之,看起来login.php没有第一次设置$ _SESSION变量,或者它是,但由于某种原因,当我第一次在登录时检查它时它没有设置.PHP

在login.php上设置变量和在loggedin.php上让isset()返回true之间有一些延迟吗?

或者,还有别的我做错了吗?

以下是相关的(我认为)代码片段:

在login.php中:

session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/loggedin.php');

在loggedin.php中:

session_start();
$authenticated = $_SESSION['authenticated'];
if (!isset($authenticated)) {
    header('Location: http://www.footballpoolz.com/mobile/index.php');
    die();
}

非常感谢任何建议或见解!

干杯, Matt Stuehler

3 个答案:

答案 0 :(得分:1)

我想我可能知道错误的原因。会话必须链接到浏览器和IP地址(这样一次可以登录多个人)。这意味着会话不仅必须存储在服务器端,而且客户端还必须具有指向会话的链接,以便您知道他们在请求数据时登录的对象。在所有HTTP请求期间,此会话ID将作为标头的一部分进行共享。

但是,当您重定向用户时,您没有给他们发送新标题的机会,是吗?您可能只是向他们发送新页面。这个新页面从未看到过它们的标题,因此它不知道哪个会话变量(PHP有数百甚至数千个会话变量)属于它们。当您以第二次重新登录时,您正在发送标题,因此您正在发送会话ID,并且PHP知道哪个会话变量是您的。

有两种解决方案。第一种是找到一种方法来重定向它们,迫使它们发送新的标题。我相信使用header("Location: www.mysite.com/newpage.php");会这样做。我可能弄错了。

另一种方法是在您将会话ID重定向到loggedin.php时临时传递会话ID,以便您知道他们已登录该首页加载。在初始页面加载后,您不再需要采取这一额外步骤,因为每次请求页面时都会为您完成。要传递会话ID,您只需将?SID=...附加到重定向。

http://www.php.net/manual/en/session.idpassing.php

答案 1 :(得分:0)

重定向真的很慢,导致额外的服务器负载。您应该做的是回发到index.php页面,该页面将检测是否有POST。然后登录用户并显示loggedin.php文件的内容。不需要重定向。

毕竟,您已经知道用户已经过验证,为什么要将用户重定向到另一个您必须再次检查验证的页面(您刚才做过)?这更像是“前端控制器”的概念,其中index.php充当加载和显示不同页面的路由器。即使它们登录时只是一个欢迎页面。这消除了任何延迟问题。

你正在做一个session_start,对吗?

答案 2 :(得分:0)

而不是使用这个真实。试着说出一些价值。

喜欢$ _SESSION ['username'] ='mattstuehler'

并检查

$ loggeduser = $ _ SESSION [ '用户名']; 如果(!空($ loggeduser))

我还没有看到任何错误