PHP сессия, кажется, не сохраняет опубликованные значения формы - PullRequest
0 голосов
/ 14 марта 2012

Дамы и господа,

Я обнаружил очень странное поведение, которое я не могу объяснить:

Предположим, у вас есть

  • несколько элементов формы на вашей странице,может быть обработано с помощью 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\">

Спасибо за разъяснение этого.Jan

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 ]

3 голосов
/ 14 марта 2012

На ключи в ассоциативном массиве $ _SESSION распространяются те же ограничения, что и на имена обычных переменных в PHP, т.е. они не могут начинаться с цифры и должны начинаться с буквы или подчеркивания.

найдено на http://php.net/manual/en/session.examples.basic.php

0 голосов
/ 14 марта 2012

Это правильно; вы не можете использовать только цифровую клавишу в $_SESSION.Попытка сделать это с 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'] );
0 голосов
/ 14 марта 2012

Может ли проблема быть целым числом в качестве имени формы, как предлагает ваш комментарий для редактирования?Если вы сериализуете форму с использованием PHP, вы получите переменную, имя которой является целым числом, а имя переменной PHP не может быть простым числом.Если ваша проблема не сохраняется с соглашением об именах, таким как <input type=\"text\" name=\"sometext_$i\">, вам следует прекратить использование простых чисел в качестве имени элемента формы.

Также рекомендуется дать описательным именам полей формы.Поле формы с именем "1" или "2" на самом деле ничего не говорит вам о содержащем значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...