【问题标题】:php session lost after submitting form提交表单后php会话丢失
【发布时间】:2013-02-19 22:04:14
【问题描述】:

页面下方的代码在 GET 请求或刷新浏览器时保持会话,但是当我提交表单时会话数据丢失。

$user=$_POST['user']; $pass=$_POST['pass'];
if ($_POST['user'])
{ if($user==$un and $pass=$pw)
  { $_SESSION['uid']=$Xid;header('Location: '.$uri.'?welcome'); }
  else { $msg="chybny login";  }
}

if(isset($_GET['logout']))   { session_destroy(); header('Location: '.$uri); }
$cnt=$_SESSION['cnt']+1; $_SESSION['cnt']=$cnt;

上面是登录代码,它在验证后将我重定向到欢迎页面,但是会话丢失了。如果我只是刷新或重复加载页面而不提交,则会话通过回显会话变量 cnt(计数为 1、2、3、...)而保持

提交表单后,我看到会话丢失并且cnt 变量也被重置?

【问题讨论】:

  • 完整性检查:你有没有打电话给session_start()
  • logout 在哪里设置为 true?同意上面的海报,添加更多你的代码。不要假设你知道错误在哪里。
  • logout 没有设置在任何地方,只是未来计划添加带有 href="?logout" 的链接
  • 会话开始在那里,会话在纯 GET 请求时工作
  • 好吧,要么你没有在哪里和尽可能频繁地打电话给session_start();,要么你以某种方式破坏它。

标签: php session session-variables


【解决方案1】:

我通常不使用会话直接尝试以下操作,将其放在脚本的顶部:

session_start();
$uid = $_SESSION['uid'];
$cnt = $_SESSION['cnt'];

然后使用变量代替

【讨论】:

    【解决方案2】:

    问题可能出在您的“和”语句上。它应该是 &&。条件不成立。

    【讨论】:

    • 错误,'and' 是可以的
    • 是的,但它看起来像垃圾,它不符合大多数正式标准。
    • 由于我最喜欢的 cms 中使用的 codemirror 插件的语法高亮习惯,学会了在 php 代码中使用 'and' 而不是 '&&'
    【解决方案3】:

    如果您 100% 确定代码一切正常,并且 PHP.ini 是问题所在,则根据您上面的 cmets。查看此链接以检查.ini http://php.net/manual/en/session.configuration.php 中的设置

    【讨论】:

    • 这很可能是这种情况,必须检查
    【解决方案4】:

    将当前会话传递到下一页...我相信这就是您要问的...

    您当前没有将会话传递到下一页并在下一页顶部使用session_start()

    将第 4 行更改为:

    { $_SESSION['uid']=$Xid;header('Location: '.$uri.'?'.SID.'&page=welcome'); } // Where "page" is the name of the data you are retrieving
    

    或者,您可以将会话数据保存到 cookie,然后在下一页检索它。

    当您在每个页面上使用 session_start("NameHere") 时,您可以交替命名会话,但是如果访问者最近访问过并且会话没有被破坏,如果您启用了它们,他们可能会看到解析错误。

    【讨论】:

      【解决方案5】:

      首先,确保您在每个页面上做的第一件事是启动一个会话(我建议您在所有子站点都需要的头文件中调用一次)。

      这样你就有了 session_start();系统中的任何地方。

      其次,收紧你的代码;使其更易于阅读。类似的东西

      $userName = isset($_POST['userName']) ? $_POST['userName'] : false;
      $password = isset($_POST['password']) ? $_POST['password'] : false;
      $logout = isset($_POST['logout']) ? $_POST['logout'] : false;
      
      $url = '../index.php';
      
      if(!($logout))
      {
          if($userName && $password)
          {
              if($userName == $un && $password == $pw)
              {
                  $_SESSION['loggedIn']=true;
                  $_SESSION['uid']=$Xid;
                  $_SESSION['message']="success";
              }
              else
              {
                  $_SESSION['loggedIn']=false;
                  $_SESSION['message']="fail, incorrect login information.";
              }
          }
          else
          {
              $_SESSION['loggedIn']=false;
              $_SESSION['message']="fail ; username and password not submitted.";
          }
          header("Location: $url");
      
      }
      else
      {
          session_start();
          session_destroy();
          session_start();
          header("Location: $url");
      }
      

      如果你想根据用户是否登录来显示不完整的内容,那么你可以简单地检查每个页面上是否设置了登录会话,而不是为此修改标题。

      【讨论】:

      • 这个答案远远超出了预期,感谢您的努力;)如前所述,我已经从那里开始了会话,并且随着会话在 GET 上进行,它在那里清晰并正常工作,是吗? '为了更好地阅读而收紧代码,我没想到这几行代码很难理解。我只是希望有人觉得这个问题很熟悉,并告诉我代码没问题,也许在 ini 或其他地方检查什么,刚刚宣布它在 apache 和 php 升级后停止工作,sooooo ... :)
      • 嗯,你检查过 ob_start 吗?不确定它是否相关,但它已经解决了我过去与会话有关的问题。 php.net/manual/en/function.ob-start.php我不太确定是什么导致了您的问题,您能否向我们展示整个代码和输出?
      • 嗨 Jonast92 是的,我的代码中的第一件事是
      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2021-12-15
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多