今天我在测试一些事情时遇到了一些奇怪的会话行为。首先,我的任务是为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有什么关系;我只是把它包括在内,给出了这样做的动机。
答案 0 :(得分:2)
$_SESSION
的键遵循与PHP中的有效变量名相同的规则。它们必须以字母或下划线开头,后跟任意数量的字母,数字或下划线。因此,time()
的输出不能作为密钥,除非它以至少一个字母或下划线为前缀。
将行error_reporting(E_ALL);
添加到您的代码中,PHP将发出如下通知:
Notice: Unknown: Skipping numeric key 1396747512 in Unknown on line 0