我正在从头开始创建网站,并且目前还停留在会话内容上。我通常知道会话如何工作以及如何在$_SESSION
之后将内容存储到session_start()
中,但是我的主要问题是这个。清除缓存并打开新窗口后,第一次提交登录请求将无法正确提交,并且页面将重新加载并且没有任何变化,但是第一次之后,它可以正常工作...我的login.php处理a)发布请求,或b)通过url登录(出于测试目的),因此将指向“ user / login.php?username = facebook&method = get”的链接发送到以下代码并进行设置用户以名称facebook登录。
<?php
session_start();
$method = $_GET['method'];
if($method == "get") $_SESSION['username'] = $_GET['username'];
else $_SESSION['username'] = $_POST['username'];
header('Location: http://www.imggroups.com');
?>
不确定是否很重要,但是,在索引页面上,我检查是否通过此操作登录了用户。显然开始会话,然后开始。 if(isset($_SESSION['username'])) echo
我需要登录的任何内容。否则回显任何未登录的状态.....
问题是您将用户重定向到新页面,但是旧页面尚未完成关闭,因此会话尚未保存。
为了解决这个问题,我通常会设置一个中间页面,该页面会重定向到正确的页面。
或者,您可以在使用标头重定向之前使用session_write_close()(http://www.php.net/manual/en/function.session-write-close.php)
事实是,它正在设置会话,但是它将您重定向到不允许该会话的其他域。如果您访问的网站没有“ www”。前面的内容,然后再重定向到www版本,这说明您的会话不存在。使用以下内容:
session_set_cookie_params(0, '/', ".imggroups.com");
将其放在session_start()
之前,它将同时适用于您的网站的www版本和非www版本。
如果这是login.php的总数,我相信有更简单的方法可以做到这一点:
如果用户名实际上是通过_GET还是_POST传入的都没关系,则使用_REQUEST,因为它同时封装了两者。
if( isset($_POST['username'] ) {
$_SESSION['username'] = $_REQUEST['username'];
}
如果有关系,您不必信任或使用外部参数,只需查看其中的内容:
if( isset($_POST['username'] ) {
$_SESSION['username'] = $_POST['username'];
} else if( isset($_GET['username'] ) {
$_SESSION['username'] = $_GET['username'];
} else {
// whinge
}
我以前没有遇到过PHP的问题,但是您也可以执行session_write_close();强制它在重定向到另一个页面之前写出会话。
如果在注销后在新标签页或浏览器中打开新窗口并尝试登录在加载时卡住的登录页面,我也会看到相同的问题,因为如果我在相同的卡住的窗口上刷新,则登录到我的仪表板。但后来通过正确重定向来解决:之前
login.php(在ajax成功之后)-> index.php(如果已登录)-> dashboard.php
之后
login.php(在ajax成功之后)-> dashboard.php
希望它可以节省任何人的时间和精力,因为我遭受了很多苦难!