因此,php $ _SESSION变量可以有数字ID:$ _SESSION ['1234']

时间:2011-09-16 21:02:00

标签: php session-variables sessionid

我一直在努力解决这个问题。

我正在动态创建会话ID,以便在刷新时保留页面状态。

如果单击了一个页面元素,我将获取该元素的id并将其传递给我的服务器端脚本,该脚本将创建会话变量:

$_SESSION[$id] = $id; 

奇怪的是,这只在某些时候起作用,我把它缩小到这样一个事实,即某些元素具有纯粹的数字ID,而其他元素则没有:

if (is_numeric($id))
{
   $_SESSION[$id] = $id;
   $_SESSION['test'] = $id; 

}else{

   $_SESSION[$id] = $id;
};

在上面的示例中,只显示非数字会话ID。例如,我可以echo $_SESSION['test'];完全没有问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

$_SESSION中的顶级键不能是数字键,但更深层次的键可以是。

例如

$_SESSION['ids'][13] = $foo;
$_SESSION['ids'][666] = $bar;

答案 1 :(得分:3)

从手册中: The keys in the $_SESSION associative array are subject to the same limitations as regular variable names in PHP, i.e. they cannot start with a number and must start with a letter or underscore. For more details see the section on variables in this manual.

在会话中使用纯数字键不起作用。如果是数字,您可以尝试使用下划线。

编辑:从2015年10月的PHP 5.5.9开始,尽管不再出现手动参考,但这仍然是正确的。

测试代码:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

session_start();
$_SESSION['a123'] = 'a123';
$_SESSION['123'] = '123str';
$_SESSION[455] = '455int';
$_SESSION['_123'] = '_123';

收率:

  

注意:未知:在第0行的“未知”中跳过数字键123

     

注意:未知:在第0行的“未知”中跳过数字键455

然后var_dump($_SESSION);仅显示:

array(2) {
  ["a123"]=>
  string(4) "a123"
  ["_123"]=>
  string(4) "_123"
}

当会话数据在请求here结束时序列化时,实际上会发生这种情况。显然,会话引擎本身会阻止将数字会话密钥保存到会话中。

答案 2 :(得分:2)

拥有一个全数字元素id(即<div id="123">)是不好的做法 - 你应该放置至少一个字母字符,例如<div id="e123">。这应该可以解决您的问题 - 或者您可以在创建会话时添加字母字符,然后在刷新页面时将其删除:

$_SESSION[$id] = substr($str, 0, 1);