会话变量在PHP中消失

时间:2014-04-06 01:13:47

标签: php session theory

今天我在测试一些事情时遇到了一些奇怪的会话行为。首先,我的任务是为WordPress网站创建注册功能。我过去在WordPress中做过相当多的工作,但我从未做过涉及任何服务器端脚本语言的任何事情。

我正在测试我的工作环境,这包括确保我能够连接到MySQL,确保会话正常工作,并且基本上只是熟悉设置。

在测试会话时,我做了以下事情:

<?php
$timer = time();

$_SESSION[$timer] = $timer;

print_r($_SESSION);
?>

我期待在第一次加载页面时看到这样的内容:

Array
(
    [1396745563] => 1396745563
)

......这正是发生的事情。在第二次刷新时,我想看到:

Array
(
    [1396745563] => 1396745563
    [1396745570] => 1396745570
)

......相反,我看到了:

Array
(
    [1396745570] => 1396745570
)

哇!时间戳1396745563的原始会话变量已经消失,并且在其中有一个新的。

我的直接反应是可能遗漏了session_start(),但事实并非如此。为了进一步说服自己,有些事情是奇怪的,我改变了我的代码:

<?php
$timer = time();

$_SESSION['time_' . $timer] = $timer;

print_r($_SESSION);
?>

我认为可能有一个带有索引时间戳的会话变量有某种特殊行为(对于我所知道的所有问题,这可能就是这个问题的答案)。

这一次,行为与我的预期完全一样。每次刷新页面都会添加到阵列打印输出。刷新页面后,它看起来像这样:

Array
(
    [time_1396745663] => 1396745663
    [time_1396745667] => 1396745667
    [time_1396745671] => 1396745671
    [time_1396745675] => 1396745675
    [1396745570] => 1396745570
)

那个古怪的变量是从我原来的尝试中延续下来的会话数据(我只是在准确)。

有人可以解释这种极其奇怪的行为吗?我想不出任何可以做到的明显的事情会导致这种情况。

注意:我怀疑这与WordPress有什么关系;我只是把它包括在内,给出了这样做的动机。

1 个答案:

答案 0 :(得分:2)

$_SESSION的键遵循与PHP中的有效变量名相同的规则。它们必须以字母或下划线开头,后跟任意数量的字母,数字或下划线。因此,time()的输出不能作为密钥,除非它以至少一个字母或下划线为前缀。

将行error_reporting(E_ALL);添加到您的代码中,PHP将发出如下通知:

  

Notice: Unknown: Skipping numeric key 1396747512 in Unknown on line 0