Очень странное поведение $ _SESSION - PullRequest
2 голосов
/ 21 декабря 2011

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

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

  1. Страница загружается, сессия начинается
  2. Если $ _SESSION['set'] не установлено, затем установите значение TRUE.
  3. Отображение остальной части страницы и формы.
  4. Пользователь нажимает кнопку "Добавить еще один элемент".
  5. Данные страницыпубликуется для себя
  6. Страница проверяет, что $ _SESSION ['set'] = True и $ _POST ['add_item'].
  7. Page создает переменные сеанса в массиве и добавляетотправил значения в эти сеансы.
  8. Страница увеличивает $ _SESSION ['Тариф_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

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

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

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 не перехватывает событие, когда пользователь нажимает "Добавить"кнопка «Другой тариф» при первом нажатии, но затем обнаруживает ее?

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

С Рождеством!

1 Ответ

3 голосов
/ 21 декабря 2011

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

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

При первом вызове add item сеанс не устанавливается, поэтому вы настраиваете сеанс.И затем игнорировать отправленные данные.

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

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

if (posting data) {
   add data to session
}
...