php$会话变量能否具有数字id,因此:$会话[';1234’;]

php$会话变量能否具有数字id,因此:$会话[';1234’;],php,session-variables,sessionid,Php,Session Variables,Sessionid,我一直在为这个问题发疯 我正在动态创建会话id,以便在刷新时保留页面状态 如果单击某个页面元素,我将获取该元素的id并将其传递给创建会话变量的服务器端脚本: $_SESSION[$id] = $id; 奇怪的是,这只在某些时候起作用,我将其缩小到了一个事实,即某些元素具有纯数字id,而其他元素则没有: if (is_numeric($id)) { $_SESSION[$id] = $id; $_SESSION['test'] = $id; }else{ $_SESSI

我一直在为这个问题发疯

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

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

$_SESSION[$id] = $id; 
奇怪的是,这只在某些时候起作用,我将其缩小到了一个事实,即某些元素具有纯数字id,而其他元素则没有:

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

}else{

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


有什么想法吗?

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

$\u会话[$id]=substr($str,0,1)

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

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

编辑:从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';

当会话数据在请求结束时被序列化时,实际上会出现这种情况。显然,会话引擎本身阻止将数字会话键保存到会话。

$\u会话中的顶级键不能是数字键,但深层键可以

例如


$\u SESSION
应该是一个关联数组,因此可能不允许使用提示序列数组的数字键。元素ID以数字开头不仅是一种不好的做法,而且是完全不允许的。@Benjam:我见过它在一些情况下工作(只有现代浏览器)-我只建议在难以添加字母字符时使用替代方法,例如,已存储在数据库中等。如果通过JS分配数字ID,则数字ID有效。但是不允许这样做,CSS将无法为它们设置样式。@Alex:查看HTML5规范,似乎你是正确的。它没有说明ID的语法,只说明它不能有任何空格字符,并且长度必须至少为1个字符。谢谢。@Benjam我是我项目的老板,我说“这是允许的”;)它仍然适用于我测试过的所有浏览器,包括旧的IE版本,但这不只是关于命名约定的争论吗?这不再是手册中的内容(至少谷歌和我找不到它)。这也不是真的:会话数组键可以以数字开头(如“35a”)。(同时“必须以字母或下划线开头”表示它不是以数字IMHO开头)@StevenSpark我也找不到引用,但它似乎仍然是真的。请参阅我的最新答案。
array(2) {
  ["a123"]=>
  string(4) "a123"
  ["_123"]=>
  string(4) "_123"
}
$_SESSION['ids'][13] = $foo;
$_SESSION['ids'][666] = $bar;