PHP会话似乎不会保持发布的表单值

时间:2012-03-14 11:05:09

标签: php forms session

女士和男士,

我发现了一个非常奇怪的行为,我无法解释:

假设你有

  • 您网页上的多个表单元素,可能由php
  • 呈现
  • 每个表单都有一个具有唯一名称的输入字段
  • 在该页面的开头会话将开始
  • 将每个发布的输入值存储在$ _SESSION变量
像这样:

<?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 ... 虽然,刷新后它已经消失......

3 个答案:

答案 0 :(得分:3)

  

$ _SESSION关联数组中的键受到与PHP中常规变量名相同的限制,即它们不能以数字开头,必须以字母或下划线开头。

找到http://php.net/manual/en/session.examples.basic.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'] );