【问题标题】:Session variables seem not to be saved会话变量似乎没有被保存
【发布时间】:2012-03-05 17:15:19
【问题描述】:

很简单的代码:

<?
session_start();
$_SESSION['t'.time()]     = "ok";
echo "<pre>".print_r($_SESSION, 1)."</pre>";
?>

如预期的那样显示像

Array
(
    [t1330966834] => ok
    [t1330966835] => ok
    [t1330966836] => ok
)

在 3 页重新加载后。

我们换几个符号:

$_SESSION[time()]     = "ok";

(现在没有't'),我希望在几次重新加载之后像

Array
(
    [t1330966834] => ok
    [t1330966835] => ok
    [t1330966836] => ok
    [1330967020] => ok
    [1330967021] => ok
    [1330967022] => ok
    [1330967023] => ok
)

但实际上结果完全不同:

   Array
    (
        [t1330966834] => ok
        [t1330966835] => ok
        [t1330966836] => ok
        [1330967020] => ok
    )

我们有 3 个以前的数组单元格和一个且只有一个“时间”单元格 - 无论您重新加载页面多少次。时间是正确的,它每秒都不同,但只有一个单元格没有't'! 我也试过了

$t =time();
$_SESSION[$t]     = "ok";

甚至

$t =intval(time());
$_SESSION[$t]     = "ok";

但随着时间的推移,它仍然只有一个细胞。

在 2 个不同的服务器上测试 php 5.2.13 和 5.3.10。 我做错了什么?

【问题讨论】:

  • 尝试同时分配$_SESSION['t'.time()] = 'ok'; $_SESSION[time()] = 'ok' 看看会发生什么。如果t 版本不断出现而baretime 版本没有出现,那么就发生了一些奇怪的事情。
  • 我对 PHP 会话变量的奇怪之处了解不多,无法回答这个问题,但是当您取出 t 时,它变成了数字索引而不是字符串索引。也许 PHP 只在会话变量中存储一个数字索引或什么?不确定,但似乎与此有关。

标签: php session time


【解决方案1】:

$_SESSION 关联数组中的键受到与 PHP 中常规变量名称相同的限制,即它们不能以数字开头,必须以字母或下划线开头。有关详细信息,请参阅本手册中有关变量的部分。

http://php.net/manual/en/session.examples.basic.php

【讨论】:

    【解决方案2】:

    当启动 error_reporting 时,您应该注意到这一点:

    中的注意事项...:session_write_close():跳过数字键 1330967020

    会话变量的数字索引为not supported

    【讨论】:

      【解决方案3】:

      并不奇怪。它只是跳过数字键。如果您已启用要显示的通知,您会看到此错误。

      正如this php.net 上的评论所述。您不应该使用数字键来定义会话中的值。

      引用

      注意不要尝试使用整数作为 $_SESSION 数组的键(例如 $_SESSION[0] = 1;),否则您将收到错误“注意:未知:跳过数字键 0。在线未知0"

      【讨论】:

        猜你喜欢
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 2016-06-15
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多