这是另一个令人头疼的时刻,我想知道是否有人能够解释我所拥有的这个问题。
我设法用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时,新会话的行为是相同的。
答案 0 :(得分:2)
问题在于您在启动活动会话之前检查活动会话的方式。应该在每个页面上调用session_start()
,因此您不需要那些if(!isset($_SESSION))
,如果您删除它们,页面应该正常工作。
但是如果出于某种原因你必须检查会话是否已经开始,那么根据this answer这样做的正确方法是:
if (session_status() == PHP_SESSION_NONE) {
session_start();
}