我一直在努力解决这个问题。
我正在动态创建会话ID,以便在刷新时保留页面状态。
如果单击了一个页面元素,我将获取该元素的id并将其传递给我的服务器端脚本,该脚本将创建会话变量:
$_SESSION[$id] = $id;
奇怪的是,这只在某些时候起作用,我把它缩小到这样一个事实,即某些元素具有纯粹的数字ID,而其他元素则没有:
if (is_numeric($id))
{
$_SESSION[$id] = $id;
$_SESSION['test'] = $id;
}else{
$_SESSION[$id] = $id;
};
在上面的示例中,只显示非数字会话ID。例如,我可以echo $_SESSION['test'];
完全没有问题。
有什么想法吗?
答案 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);