【问题标题】:PHP Session variable lost after refresh / redirect刷新/重定向后PHP Session变量丢失
【发布时间】:2014-03-23 11:57:30
【问题描述】:

我正在制作登录页面,一切正常,但是在刷新安全页面或重定向到另一个页面变量时消失了。

登录:

<?php session_start(); 

//connection to database and other stuff

if ($user == $dbuser && $pass == $dbpass) {

    $_SESSION['user'] = $user;
    $_SESSION['authenticated'] = "yes";
    $suser = $_SESSION['user']; //just to test if session works

}

?>

安全页面:

<?php session_start(); ?>

//small amount of html here

<?php
    $suser = $_SESSION['user'];
    $sauth = $_SESSION['authenticated'];

    if ($sauth != 'yes') { //not completed yet (needs user name check)
        echo "<a href='./'>Log in</a> first!";
        require ('./login.php');
        die;
    } else {
    //not so important code here
    }
?>

//rest of html here

我没有发现任何错误,并且错误日志文件很干净,所以它一定是别的东西。会话在重定向到安全页面后工作正常,但正如我之前所说的刷新页面或另一个重定向会清除会话变量。

页面:http://nano.filiparag.com/admin/ 如果你想测试它只需询问用户名和密码

注意:
现在我尝试使用setcookie() 执行此操作,但它再次不起作用


已解决

问题出在注销按钮上。我为它制作了单独的 PHP 文件,现在一切正常。

【问题讨论】:

  • 是否总是定义$dbuser$dbpass?如果不是,那么 if 块将返回 true,因为所有 4 个变量都可能是未定义/错误的。这将覆盖您的 $_SESSION['user']$_SESSION['authenticated'] 值。
  • @jraede 不要担心 db*,因为它们总是被定义的——从数据库中获取。
  • 你确定吗?从您的代码中,我可以看到唯一可以将该人注销的内容。发布更多代码可能会有所帮助,以及在登录后如何将它们重定向到安全页面的说明。
  • @jraede 数据库连接是上面登录页面中 if 语句的代码。他们会收到消息“作为示例登录”和单击以进行重定向的链接。登录表单调用(操作)本身(同一个文件)。
  • 检查会话 ID 是否正在改变。如果是你的浏览器中没有设置cookie。

标签: php session redirect login session-variables


【解决方案1】:

我觉得你可以试试这个

登录:

<?php session_start(); 
ob_start();
//connection to database and other stuff

if ($user == $dbuser && $pass == $dbpass) {

    $_SESSION['user'] = $user;
    $_SESSION['authenticated'] = "yes";
    $suser = $_SESSION['user']; //just to test if session works

}

?>

安全页面:

<?php session_start(); 
  ob_start();?>

//small amount of html here
<?php session_start(); ob_start();
    $suser = $_SESSION['user'];
    $sauth = $_SESSION['authenticated'];

    if ($sauth != 'yes') { //not completed yet (needs user name check)
        echo "<a href='./'>Log in</a> first!";
        require ('./login.php');
        die;
    } else {
    //not so important code here
    }
?>

//rest of html here

【讨论】:

  • 还是一样。变量消失
【解决方案2】:

我猜你的login.php 脚本在你包含它时正在对会话变量做一些事情。我可以看看你的login.php 脚本,然后我会编辑我的答案

【讨论】:

  • 我已经发现了问题所在。无论如何,谢谢你的回答!
猜你喜欢
  • 2017-01-04
  • 2014-08-14
  • 2023-03-29
  • 2010-12-24
  • 2012-07-08
  • 2013-06-19
相关资源
最近更新 更多