20

这是我的登录页面的代码,其中登录脚本检查用户的真实性,然后使用标题功能重定向到收件箱页面。

<?php
session_start();

include_once('config.php');
$user=htmlentities(stripslashes($_POST['username']));
$password=htmlentities(stripslashes($_POST['password']));
// Some query processing on database    

if(($id_user_fetched<=$id_max_fetched) && ($id_user_fetched!=0)){
$_SESSION['loggedIn'] = 'yes';
    header("Location:http://xyz/inbox.php?u=$id_user_fetched");
    //echo 'Login Successful';
    }else{
        echo 'Invalid Login';
        echo'<br /> <a href="index.html">Click here to try again</a>';
        }
}else{
    echo mysqli_error("Login Credentials Incorrect!");
    }
?>

inbox.php 页面如下所示:

<?php
session_start(); 
echo 'SESSION ='.$_SESSION['loggedIn'];
if($_SESSION['loggedIn'] != 'yes'){
echo $message = 'you must log in to see this page.';
//header('location:login.php');
}
 //REST OF THE CODE

?>

现在使用上面的代码,inbox.php 总是显示输出:SESSION=you must login to see this page。这意味着会话变量未设置或 inbox.php 无法检索会话变量。我哪里错了?

4

11 回答 11

50
  1. 确保session_start();在调用任何会话之前调用。因此,一个安全的选择是将它放在页面的开头,紧接在开始<?php标记之后,然后再放在其他任何地方。还要确保在开始标记之前没有空格/制表符<?php
  2. 重定向后header,使用结束当前脚本exit();(其他人也建议使用session_write_close();and session_regenerate_id(true),您也可以尝试这些,但我会使用exit();)。
  3. 确保在您用于测试的浏览器中启用了 cookie。
  4. 确保register_globals已关闭,您可以在php.ini文件上进行检查,也可以使用phpinfo(). 有关如何将其关闭的信息,请参阅此内容。
  5. 确保您没有删除或清空会话。
  6. 确保您的$_SESSION超全局数组中的键在任何地方都没有被覆盖。
  7. 确保您重定向到同一个域。因此,从 a 重定向www.yourdomain.comyourdomain.com不会继续会话。
  8. 确保您的文件扩展名是.php(它发生了!)。

重定向后PHP会话丢失

于 2013-10-30T20:00:43.850 回答
11

我有一段时间遇到同样的问题并且很难弄清楚。我的问题是我让网站工作了一段时间,会话正常工作,然后突然间一切都崩溃了。

显然,您的 session_save_path(),对我来说是 /var/lib/php5/,需要具有正确的权限(运行 php 的用户,例如 www-data 需要对目录的写访问权)。我不小心改变了它,完全打破了会话。

运行sudo chmod -R 700 /var/lib/php5/,然后sudo chown -R www-data /var/lib/php5/让 php 用户可以访问该文件夹。

于 2014-01-28T03:16:54.787 回答
7

如果您使用连接脚本,session_start();也不要忘记在连接处使用,在注意到该问题之前遇到了一些麻烦。

于 2015-10-01T16:53:41.757 回答
3

也许如果您的会话路径无法正常工作,您可以尝试session.save_path(path/to/any folder);作为替代路径。如果它有效,您可以向您的托管服务提供商询问默认路径问题。

于 2016-11-05T12:24:37.577 回答
2

也许它可以帮助别人,我自己

session_regenerate_id(false);

我删除了它,一切都好!

登录后没问题...哎哟!

于 2020-10-31T10:12:00.900 回答
1

刚刚与托管服务商谈过,这是他们最后的一个问题。他说“您的帐户 session.save_path 未设置,因此出现问题。我现在为您设置。”

之后它工作正常:)

于 2013-10-30T20:25:25.113 回答
1

我有类似的问题和 cookie 域:

    ini_set('session.cookie_domain', '.domain.com');

域设置错误,因此所有会话都被忽略,因为用户 cookie 从未设置正确,希望这对某人有所帮助。

于 2016-07-05T06:55:15.633 回答
1

会话无法工作的另一个重要原因是使用会话 cookie 设置,例如。由于简单的错误或其他开发人员出于某种原因,将会话 cookie 生命周期设置为 0 或其他低值。

session_set_cookie_params(0)
于 2017-09-23T19:57:16.990 回答
0

确保您写入会话的值是简单类型。复杂类型会导致所有会话更改从内存中删除。

我犯了一个错误,不小心将会话变量设置为对象值。这阻止了会话序列化和保存。在页面刷新之前,会话似乎是有效的。

验证这一点的一个好方法是执行 $_SESSION 的 var_dump() 和 exit() 以确保您正在编写您所期望的内容。

echo '<pre>Session: ';
var_dump($_SESSION);
echo '</pre>';
exit();

就我而言,我可以通过将用户名转换为字符串来解决问题,如下所示:

$_SESSION['Username'] = (string)$userData->Username;

费用:1晚睡眠。

于 2021-08-12T20:53:04.033 回答
0

我也遇到了同样的问题我做了以下步骤来解决这个问题

  1. 我编辑了文件 /etc/php.ini 并搜索了路径 session.save_path = "/var/lib/php/session" 你必须提供你的会话信息

2 之后只是更改了下面给出的权限 *chown root.apache /var/lib/php/session * 就是这样。以上这些步骤解决了我的问题

于 2018-05-25T12:07:52.483 回答
0

我今天遇到了这个问题。问题与 $config['base_url'] 有关。我注意到 htpp://www.domain.com 和http://example.com是问题所在。要修复,请始终将您的 base_url 设置为http://www.example.com

于 2017-05-24T18:26:38.297 回答