【问题标题】:Session variables not working php会话变量不起作用php
【发布时间】:2013-11-10 14:40:09
【问题描述】:

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

<?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=您必须登录才能看到此页面。 这意味着会话变量未设置或 inbox.php 无法检索会话变量。我哪里错了?

【问题讨论】:

  • 应该是echo "Login Credentials Incorrect!" ; 而不是echo mysqli_error("Login Credentials Incorrect!");
  • 您能否调试以确认您的if 语句的条件评估为true? (即在 true 和 false 块中回显一个语句以查看哪个在触发)
  • 1.你从同一个域调用两个脚本吗? 2. 你是否使用任何类型的 session_name、session_id、session_set_cookie? 3. session_start返回值,你检查了吗?
  • @Crackertastic 是的,我可以向您保证,它们的评估结果为真。检查了几次
  • 这是两个else 声明一个if

标签: php session session-variables


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

PHP session lost after redirect

【讨论】:

  • 可能是服务器错误?我尝试了最基本的测试示例,如下所示: session.php session2.php:
  • 我也有同样的问题。原因:没有可用的磁盘空间!
  • 对我来说同样的问题。我尝试使用谷歌云打印打印页面,但会话已关闭/清除。如何解决这个问题
  • 关于 #4:此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。 php.net/manual/en/security.globals.php
  • #7 是关键,在 www 上登录然后在没有 www 的情况下在 url 上测试会使会话消失!
【解决方案2】:

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

然后它就可以正常工作了:)

【讨论】:

    【解决方案3】:

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

    显然,您的 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用户可以访问该文件夹。

    【讨论】:

    • 777 是会话保存文件夹的一组错误权限。您需要更改文件夹的所有权,以允许 Web 服务器对其进行写入并阻止所有其他访问。
    • HOOOOLY SHIT 伙计,祝你生活中一切顺利,我真的哭了,因为我无法进入下一页。
    【解决方案4】:

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

    【讨论】:

    • 哦!我有一个表单,我输入用户名并尝试在其他页面上使用该用户名。基本上,我的错误是没有在我检索该用户名的另一个页面上调用session_start()。谢谢。这真的很有帮助。
    【解决方案5】:

    我有类似的问题和 cookie 域:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          session_set_cookie_params(0)
          

          【讨论】:

            【解决方案9】:

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

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

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

            【讨论】:

              【解决方案10】:

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

              session_regenerate_id(false);
              

              我删除了它,一切正常!

              登录成功后...哎哟!

              【讨论】:

                【解决方案11】:

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

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

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

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

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

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

                费用:睡一晚。

                【讨论】:

                  猜你喜欢
                  • 2015-09-30
                  • 2012-08-17
                  • 2014-05-16
                  相关资源
                  最近更新 更多