【问题标题】:Session variable empty after reloading page?重新加载页面后会话变量为空?
【发布时间】:2016-05-12 16:18:28
【问题描述】:

我有一个带有下拉菜单的简单页面,我可以在其中选择两个值,FOOBAR。所选值应存储在我的会话变量$_SESSION['typ'] 中。到目前为止它一直有效,但我注意到每次当我按 F5 或使用 javascript 调用 location.reload() 时,会话变量都会由于某种未知原因被清除。

ma​​in.php

<?php
ini_set('session.gc_maxlifetime', 1);
session_set_cookie_params(0.1);

session_start();

if (!isset($_SESSION['typ']))
{

    $typ = "FOO";    //load default value
    $_SESSION['typ'] = $typ;
    //---Debug Output----
    $tmpvar = $_SESSION['typ'];
    echo "<p>Session variable is not set</p>";
    echo "<p>Session variable value: '$tmpvar'</p>";
}
else
{   
    //---Debug Output----
    $tmpvar = $_SESSION['typ'];
    echo "<p>Session variable is set, value = '$tmpvar' </p>";

    $typ = $_SESSION['typ'];  //initialise variable $typ with session variable
}
?>

我可以在其中设置我的 $typ 变量的下拉菜单。

    <form name="typ_overwrite" method="POST" action="set_typ.php" enctype="multipart/form-data">

        TYP: <select name="typ" id="typ" onchange="document.typ_overwrite.submit()">
<?php
        if($typ == "FOO")
        {
            echo '<option value="FOO">FOO</option>';
            echo '<option value="BAR" selected>BAR</option>';
        }
        elseif($typ == "BAR")
        {
            echo '<option value="BAR">BAR</option>';
            echo '<option value="FOO" selected>FOO</option>';
        }
        else
        {
            echo '<option value="ERROR">ERROR</option>';
        }
?>
        </select>
    </form>

set_typ.php

<?php
    session_start();

    $typ = $_POST['typ'];
    $_SESSION['typ'] = $typ;

    header("location:main.php");
    exit();
?>

第一次加载页面时的输出:

Session variable is not set
Session variable value: 'FOO'

从下拉菜单中选择 BAR 后的输出:

Session variable is set, value: 'BAR'

按F5或拨打location.reload()后输出

Session variable is not set
Session variable value: 'FOO'

我希望有人能告诉我为什么我的 Session 变量在重新加载页面时被清除。

【问题讨论】:

  • 只是为了确保我理解您的正确:您从带有表单的页面开始。第二步:表单调用set_typ.php,它重定向到main.php。当您现在按 F5 时,$_SESSION 变量没有设置?
  • 是的,完全正确。但是我发现了问题,但无法真正解释它为什么起作用,请在下面找到我的答案。
  • 原因是 gc_maxlifetime 定义了以 为单位的时间,直到会话数据(会话变量)被视为垃圾。也许你只是点击太慢了;-)
  • 啊,我明白了,如果我将其设置为 1000,它会起作用,看来我找到有关会话信息的来源已过时或不正确。谢谢你:)

标签: javascript php html session variables


【解决方案1】:

我发现了问题... 这是因为这行代码,我现在注释掉它,它可以按预期工作。谁能解释我必须在哪里设置它?

ini_set('session.gc_maxlifetime', 1);

编辑: 原因是 gc_maxlifetimes 参数单位是秒,而不是我想的小时,所以会话在 1 秒后过期,因此会话变量被清除。感谢 hherger 指出这一点。

【讨论】:

  • 0.1 表示 0.1 秒作为 cookie 生命周期。我建议将其设置为 0(null),这意味着“直到客户端浏览器关闭”。
  • 哦,对不起,我复制了错误的代码行,我编辑了我的答案。但你是对的,这是因为我将 gc_maxlifetime 设置为 1,在我将其设置为 1000 后,它按预期工作。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多