Очень странное поведение $_SESSION

У меня есть сеанс, который я использую для хранения элементов в форме, которые накапливаются пользователем, пока пользователь не захочет перейти к оформлению заказа. Это немного похоже на корзину покупок, куда можно добавлять товары из формы.

Логическая разбивка кода:

  1. Страница загружается, сеанс начинается
  2. Если $_SESSION['set'] не установлен, установите для него значение TRUE.
  3. Отображение остальной части страницы и формы.
  4. Пользователь нажимает кнопку «Добавить другой элемент».
  5. Данные страницы публикуются сами по себе
  6. Страница проверяет, что $_SESSION['set'] = True и $_POST['add_item'] установлен.
  7. Страница создает переменные сеанса в массиве и добавляет опубликованные значения в эти сеансы.
  8. Страница увеличивается на $_SESSION['tariff_count'], если необходимо добавить больше

Проблема в том, что мой код ведет себя не так, как должен. Когда я нажимаю кнопку «Добавить новый тариф» в первый раз, моя функция if не перехватывает ее. Это должно быть немедленно поймано. Однако, когда я иду и снова нажимаю кнопку, она, наконец, работает и добавляет элемент в мой сеанс.

Вот код:

//start a session to remember tariff items 
session_start();

//testing the session array
print_r($_SESSION);

//destroy session if this character is found in URL string
$des = $_GET['d'];
if($des == 1)
{
  session_destroy();
}

//checks to see if session data has been set

//if a session variable count is set then 
if ($_SESSION['set'] == TRUE)
{
  //perform a check to ensure the page has been called by the form button and not been accidently refreshed
  if(isset($_POST['add_tariff']))
  { 
    //if user clicks Add another tariff button then increase tariff count by one

    //temp variable set to the current count of items added
    $count = $_SESSION['tariff_count'];
    $_SESSION['tariff_name'][$count] = $_POST['tariff_name'];
    $_SESSION['tariff_net'][$count] = $_POST['tariff_net'];
    $_SESSION['tariff_inclusive'][$count] = $_POST['tariff_inclusive'];
    $_SESSION['tariff_length'][$count] = $_POST['tariff_length'];
    $_SESSION['tariff_data'][$count] = $_POST['tariff_data'];
    //increment tariff count if more data needs to be added to the sessions later.
    $_SESSION['tariff_count']++;
  }
}
//if no session data set then start new session data
else
{   
  echo "session set";
  $_SESSION['set'] = TRUE;
  $_SESSION['tariff_count'] = 0;
}

Код, кажется, подделывает мои массивы данных сеанса. Все мои добавленные элементы в сеансе отображаются в таблице.

Однако, если моя таблица показывает шесть элементов, если я выполняю print_r сеанса, он показывает только 4 элемента в массиве? Я протестировал его, чтобы убедиться, что я не перепечатываю одни и те же экземпляры в массиве.

Вот print_r массива, который показывает шесть строк, но в этом массиве только четыре строки?

[tariff_count] => 5 [tariff_name] => Array (
    [0] => STREAM1TARIFF [1] => STREAM1TARIFF [2] => CSS [3] => CSS [4] => CSS
  ) 

Я также сделал скриншот, чтобы показать эту странную проблему.

http://i.imgur.com/jRenU.png

Примечание. Я повторил «Истинное значение = 6», но в print_r сеанса это только 5, поэтому в моем коде отсутствует один экземпляр (n-1).

Вот мой код, который печатает все экземпляры в массивах сеансов, у меня есть ощущение, что часть проблемы несоответствия вызвана сравнением "‹="?

if(isset($_SESSION['tariff_count']))
{
  for ($i = 0; $i <= $count; $i++)
  {
    echo "<tr>";
    echo "<td>".$_SESSION['tariff_name'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_net'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_inclusive'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_length'][$i]."</td>";
    echo "<td>".$_SESSION['tariff_data'][$i]."</td>";
    echo "</tr>";
  }
}

Вставьте корзину php-страницы - http://pastebin.com/petkrEck

Любые идеи, почему мой оператор If не улавливает событие, когда пользователь нажимает кнопку «Добавить другой тариф» при первом нажатии, но затем обнаруживает это?

Спасибо за ваше время

Счастливого Рождества!


person tomaytotomato    schedule 21.12.2011    source источник
comment
Пожалуйста, не могли бы вы также показать HTML формы и любой Javascript, связанный с тем, как она отправляется?   -  person DaveRandom    schedule 21.12.2011
comment
@DaveRandom — ссылка на pastebin pastebin.com/petkrEck   -  person tomaytotomato    schedule 21.12.2011
comment
@loosebruce: это не тот ответ, который вы ищете, но ваш массив имеет индекс, начинающийся с нуля. Если вы посмотрите внимательно, часть, когда вы опубликовали [tariff_count] => 5 (из вашего print_r), на самом деле в массиве 5 элементов (0, 1, 2, 3, 4).   -  person netcoder    schedule 21.12.2011
comment
@netcoder - да, но если вы посмотрите на мой снимок экрана, вы увидите, что фактическое количество равно 6, поэтому в массиве должно быть шесть элементов, поэтому мне не хватает экземпляра в моем массиве - i.imgur.com/jRenU.png   -  person tomaytotomato    schedule 21.12.2011


Ответы (1)


Проблема в вашем потоке кода. В упрощенном псевдокоде вы делаете это:

if (session is not initialized) {
    set = true
    count = 0;
} else {
    add posted data to session
}

При первом вызове «добавить элемент» сеанс не настроен, поэтому вы настраиваете сеанс. А ТОГДА ИГНОРИРУЙТЕ РАЗМЕЩЕННЫЕ ДАННЫЕ.

Поток кода должен быть:

if (session is not initialized) {
    set = true;
    count = 0;
}

if (posting data) {
   add data to session
}
person Marc B    schedule 21.12.2011
comment
большое спасибо! Я исправил это, и теперь он работает после первого нажатия! Хорошего Рождества! - person tomaytotomato; 21.12.2011