【问题标题】:Session not set till page reload?在页面重新加载之前没有设置会话?
【发布时间】:2014-11-09 14:29:50
【问题描述】:

所以经过大量的试验和错误后,我设置了一些东西来测试我的会话是否已设置,如下所示:

<?php
session_start();
if (isset($_SESSION['email'])) {
    echo "Logged In!";
}
else {
    echo "NOT LOGGED IN!";
}
?>

我意识到,在登录后(重定向到网站的主页),在我重新加载整个主页之前,不会设置会话。

有没有人经历过这样的事情和/或知道如何解决这样的问题?

提前致谢!

【问题讨论】:

  • 这似乎很明显,但请确保在尝试阅读之前设置会话变量...您在哪里设置 $_SESSION['email']?您说登录行为将用户重定向到主页。 $_SESSION['email'] 在重定向发生之前是否已经设置,还是在主页本身设置?
  • 是的,当(如果)登录表单被验证时,$_SESSION['email'] 被设置,然后我使用例如 header('location:home.php') 重定向到主页@MattRabe
  • 好的。在设置 $_SESSION['email'] 之前,您是否在该处理页面上执行 session_start() ?
  • 这段代码是不是首页第一?
  • @Rasclatt 不,这只是我用来测试会话是否设置的 php 文件。例如,在我被重定向到 www.domain.com 后,我将输入网址:www.domain.com/sessiontest.php

标签: php session session-cookies reload isset


【解决方案1】:

我在这方面度过了一段可怕的时光。我有一个每次加载的索引页面,并且在内容 div 中通过包含加载特定的 php 脚本。我通过将 GET 变量传递给 index.html 以这种方式控制网站的导航,因此无论您正在查看什么内容,我的索引页面每次都会加载。 index.html 的第一行是:

<?php
session_start();

我的一些作为包含在索引页面上运行的 php 脚本会设置会话变量,然后重定向到索引页面,会话变量将不存在,或者它们不会设置为应有的值。这让我发疯,我可以 ctrl-F5 有时它们会出现,有时不会出现。我唯一能想到的是,它以某种方式为地址栏中的不同 url 打开不同的会话(通过不同的 url,我的意思是具有不同 GET 参数的那些。简单地把它放在我的 index.html 的开头解决了我所有的问题. 我假设这会导致每次打开相同的会话:

   <?php
   session_name('SessName');
   session_start();

【讨论】:

    【解决方案2】:

    感谢所有帮助,但我发现了问题。 显然我必须非常具体地在重定向文件中使用我的网址。

    我有header('location: http://domain.com');

    而不是

    header('location: http://www.domain.com');

    ...捂脸

    【讨论】:

      【解决方案3】:

      您的页面需要按此顺序设置(尤其是session_start()):

      登录.php

      <?php
      session_start();
      // 1) Some code here to check database if username and password check out
      // 2) If username and password check out and validation is good
      // 3) Redirect to your next page (index.php in this case)
      ?>
      

      index.php(主页)

      <?php
      session_start();
      ?><!DOCTYPE html>
      <html>
      <head>
      </head>
      <body>
      <h1><?php
      if(isset($_SESSION['email'])) { ?>
      EMAIL IS SET!! Great job!
      <?php } else { ?>
      UM...No..<?php } ?></h1>
      </body>
      </html>
      

      【讨论】:

        【解决方案4】:

        这个 sn-p 的代码对我来说是一个测试。确保您的操作顺序与此匹配。如果这不起作用,请确保您在浏览器中允许使用 cookie。否则,您的 PHP/Apache 配置可能会出现问题。

        <?php
        session_start();
        
        if (!isset($_GET['test']))
        {
            $_SESSION['email'] = "something ".time();
            header('location:?test');
            die;
        }else{
            echo 'Value: "' .$_SESSION['email']. '"';
            echo '<br /><br /><a href="?">&lt; Do again</a>';
            die;
        }
        ?>
        

        【讨论】:

        • 抱歉,我在这方面是个菜鸟,但我在理解您的代码时遇到了一些麻烦。主要是第 3 行,究竟是什么 $_GET['test'] ?它在这里的作用是什么?谢谢
        • @user3817799: $_GET['test'] 是对名为“test”的查询字符串 var 的引用(例如:abc.com/page.php?test=123 - 在本例中为 $_GET['test'] == "123")。我使用它来允许这个 PHP 文件执行两个功能:1) 设置 $_SESSION var,以及 2) 读取 $_SESSION var。如果$_GET['test'] 未设置(这是默认设置),那么我设置会话变量并重定向到?test。当页面加载时,$_GET['test'] 将被设置,脚本将执行后半部分。重要的是,这也表明session_start() 需要首先出现在两个“页面”上。
        猜你喜欢
        • 2017-01-15
        • 2018-06-07
        • 2016-06-26
        • 2020-04-30
        • 2020-01-25
        • 2014-11-25
        • 2018-01-23
        • 2020-11-24
        • 2020-09-08
        相关资源
        最近更新 更多