php $_SESSION 变量可以有数字 id 吗: $_SESSION['1234']

问题描述 投票:0回答:3

这个问题让我快抓狂了。

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

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

$_SESSION[$id] = $id; 

奇怪的是,这仅在某些时候有效,我将其范围缩小到以下事实:某些元素具有纯数字 id,而其他元素则没有:

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

}else{

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

在上面的示例中,只有非数字会话 ID 可见。例如,我可以

echo $_SESSION['test'];
完全没有问题。

有什么想法吗?

php session-variables sessionid
3个回答
5
投票

来自手册:

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 变量命名规则。


4
投票

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

例如。

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

2
投票

使用全数字元素 id(即

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

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

© www.soinside.com 2019 - 2024. All rights reserved.