【问题标题】:Session Variables Disappearing in PHP会话变量在 PHP 中消失
【发布时间】:2014-04-06 01:13:47
【问题描述】:

我今天在测试一些东西时遇到了一些奇怪的会话行为。首先,我的任务是为 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 有什么关系;我只是为了给出这样做的动机。

【问题讨论】:

  • 如果您在顶部添加了session_start();,您会看到此通知。Unknown: Skipping numeric key。在使用会话之前添加 session_start(); 始终是一个好习惯。

标签: php session theory


【解决方案1】:

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

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

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

【讨论】:

  • 还有 session_start();必须在开头调用
  • @user4035 问题的作者说“我的第一反应是session_start() 可能丢失了,但事实并非如此。”
  • 感谢您的快速回答!这确实是我遇到的问题,但缺少可见的错误消息让我认为它“正常”工作。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
相关资源
最近更新 更多