女士和男士,
我发现了一个非常奇怪的行为,我无法解释:
假设你有
<?php
session_start();
$_SESSION["Test"] = "Hello";
foreach ($_POST as $name => $value) {
//echo "_POST: " . $name . ":" . $value . "<br>";
$_SESSION[$name] = $value;
//session_commit();
}
for ($i = 0; $i < 10; $i++) {
echo "<form action=\"multiform.php\" method=\"post\">Value for input $i: <input type=\"text\" name=\"input".$i."\"></form>\n";
}
print_r($_SESSION);
?>
如果使用上述代码,则刷新页面后只会保留“Test”=“Hallo”。无论哪个输入值已被foreach发布并存储到会话中,它将在刷新后消失。
现在有趣的部分:
如果你在表格中添加一个名字......
echo "<form name=\"form$i\" action=\"multiform.php\" method=\"post\">Value for input $i: <input type=\"text\" name=\"input".$i."\"></form>\n";
...随后将存储已发布的值。
但为什么呢? 表单名称与$ _SESSION的持久性有什么关系?
编辑:如果输入名称只包含数字,则问题似乎在于:
<input type=\"text\" name=\"$i\">
感谢您澄清这一点。 扬
EDIT2:
如果$ _SESSION数组的访问者密钥只包含数字,那么php显然不会保留这些值,所以不会存储这样的内容:
<?php
session_start();
for ($i = 1; $i < 10; $i++)
{
$_SESSION[$i] = "Hello $i";
}
?>
令人困惑的部分是,如果你做了
print_r($_SESSION)
在for循环之后,它将显示1-10与Hello 1..10 ... 虽然,刷新后它已经消失......
答案 0 :(得分:3)
$ _SESSION关联数组中的键受到与PHP中常规变量名相同的限制,即它们不能以数字开头,必须以字母或下划线开头。
答案 1 :(得分:0)
问题可能是编辑评论建议的整数作为表单名称吗?如果使用PHP序列化表单,最终会得到一个名称为整数的变量,而PHP的变量名称不能是普通数字。如果您的问题不能使用<input type=\"text\" name=\"sometext_$i\">
等命名约定,则应停止使用普通数字作为表单元素名称。
为表单字段提供描述性名称也是一个好主意。名为“1”或“2”的表单字段并不能真正告诉您有关包含值的任何信息。
答案 2 :(得分:0)
这是正确的; $_SESSION
中的you can not use a numeric-only key。尝试使用最高级别的error_reporting并将display_errors设置为true来生成通知:
PHP Notice: Unknown: Skipping numeric key 0 in Unknown on line 0
它确实将它存储在$ _SESSION数组中,但实际上并不存储在会话中。虽然行为很奇怪,但通知足够具有描述性。顺便说一下,修复很容易,只需在$_SESSION['numbers']
中创建一个数组。
<?php
session_start();
for ($i = 1; $i < 10; $i++) {
$_SESSION['numbers'][$i] = "Hello $i";
}
var_dump( $_SESSION['numbers'] );