这个问题让我快抓狂了。
我动态创建一个会话 ID,以便在刷新时保留页面状态。
如果单击页面元素,我会获取该元素的 id 并将其传递给创建会话变量的服务器端脚本:
$_SESSION[$id] = $id;
奇怪的是,这仅在某些时候有效,我将其范围缩小到以下事实:某些元素具有纯数字 id,而其他元素则没有:
if (is_numeric($id))
{
$_SESSION[$id] = $id;
$_SESSION['test'] = $id;
}else{
$_SESSION[$id] = $id;
};
在上面的示例中,只有非数字会话 ID 可见。例如,我可以
echo $_SESSION['test'];
完全没有问题。
有什么想法吗?
来自手册:
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 开始,尽管手动参考不再出现,但这似乎仍然是正确的。
编辑 2:截至 2023 年 12 月,对于 PHP 8.1.14 和 PHP 8.3.0-RC1 仍然如此。
PHP Warning: Unknown: Skipping numeric key 123 in Unknown on line 0
测试代码:
<?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"
}
这实际上似乎是在请求结束时序列化会话数据时发生的。会话引擎本身会阻止数字会话密钥保存到会话中,而不是 PHP 变量命名规则。
$_SESSION
中的顶级键不能是数字,但更深级别的键可以。
例如。
$_SESSION['ids'][13] = $foo;
$_SESSION['ids'][666] = $bar;
使用全数字元素 id(即
<div id="123">
)是一种不好的做法 - 您应该至少放置一个字母字符,例如<div id="e123">
。这应该可以解决您的问题 - 或者您可以在创建会话时添加字母字符,然后在刷新页面时将其删除:
$_SESSION[$id] = substr($str, 0, 1);