无法在处理session.upload_progress.name的页面中设置会话变量

时间:2014-12-24 01:50:27

标签: php session

这是另一个令人头疼的时刻,我想知道是否有人能够解释我所拥有的这个问题。

我设法用2个简单的php页面复制了这个问题。

Page1(test.php)

这只是一个简单的文件上传表单,它也使用session.upload_progress.name隐藏字段。然后输出$_SESSION数组:

<form name="fileupload" action="test2.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123">
    <input type="file" name="newfile">
    <input type="submit" name="submit" value="Submit">
</form>
<?php
    if(!isset($_SESSION)) {
        session_start();
    }
    print_r($_SESSION);
?>

第2页(test2.php) 该页面只是添加一个会话变量,并输出$_SESSION数组。它还包含一个返回test.php的链接:

<?php
    if(!isset($_SESSION)) {
        session_start();
    }
    $_SESSION['new']='Im a new value that will disappear';
    print_r($_SESSION);
?>
<a href="test.php">Go back</a>

现在,如果你加载test1.php,它将输出:

{ The form }
Array()

点击提交,它将转到test2.php并输出:

Array
(
    [upload_progress_123] => Array
        (
            [start_time] => 1419385365
             etc etc ...
        )

    )

    [new] => Im a new value that will disappear
)

现在点击“返回”,它只会输出:

{ the form }
Array
(
    [upload_progress_123] => Array
        (
            [start_time] => 1419385365
             etc etc ...
        )

    )
)

(注意[new]不存在的方式)

为什么会发生这种情况有什么可靠的理由吗?

在此示例中,我将session.upload_progress.cleanup设置为off,以进行调试。但是当设置为on时,新会话的行为是相同的。

1 个答案:

答案 0 :(得分:2)

问题在于您在启动活动会话之前检查活动会话的方式。应该在每个页面上调用session_start(),因此您不需要那些if(!isset($_SESSION)),如果您删除它们,页面应该正常工作。

但是如果出于某种原因你必须检查会话是否已经开始,那么根据this answer这样做的正确方法是:

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}