2013-05-11 4 views
0

У меня возникли проблемы с настройкой довольно небольшого приложения. Это будет небольшой опрос.PHP: СЕССИЯ частично удалена после заголовка() + exit

Форма разбита на две части. После подачи первого, данные хранятся в $_SESSION массиве с этим:

save_items(array('my_data' => $my_data_oject)); 

Функция save_items() выглядит следующим образом:

function save_items(array $array) { 
    foreach ($array as $name => $item) { 
     $_SESSION[$name] = $item; 
    } 
} 

Тогда я unset($_POST) и перенаправлять так:

header('Location: index.php?action=survey_part2'); 
exit; 

Моя проблема: после перенаправления ранее сохраненные данные для входа все еще находятся в $_SESSION, но my_data_object нет. Если я избегу перенаправления, я вижу, что my_data_object хранится в массиве $_SESSION до начала перенаправления. Таким образом, комбинация header() и exit, похоже, частично уничтожает сеанс. Кто-нибудь знает, как это может произойти?

Наконец, части моего контроллера:

<?php 
error_reporting(E_ALL); 
session_start(); 

require_once 'models/functions.php'; 
require_once 'models/classes.php'; 

$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : NULL; 
$view = $action; 
$language = isset($_REQUEST['lang']) ? $_REQUEST['lang'] : 'de'; 

switch ($action) { 
    case 'login' : 
     if ((!empty($_POST['email'])) && (!empty($_POST['password']))) { 
      $user = new User(); 
      $login = $user->find_user($_POST); 
      if (!empty($login)) { 
       set_message('Welcome ' . $login['Firstname'] . ' ' . $login['Lastname'] . '!'); 
       save_items(array('user_id' => $login['CID'])); 
       unset($_POST); 
       redirect("index.php?action=survey&lang=de"); //<- works fine. Login is kept, Message is kept. 
      } else { 
       set_message('Please try again.'); 
       unset($_POST); 
      } 
     } else { 
      unset($_POST); 
      set_message('Try again.'); 
     } 
    break; 

/* ... shortage */ 
    case 'survey' : 
     check_login(); //<- doesn't matter 
     if (empty($_POST)) { 
      /* ... shortage */ 
     } else { 
      /* ... creation of my_data_object + setting one more message */ 
      save_items(array('my_data' => $my_data_object)); 
      unset($_POST); 
      save_items(array('test' => 'you see me?')); //<- index.php?action=survey_2 won't get it 
      //var_dump($_SESSION); 
      header('Location: index.php?action=survey_2&lang=de'); //<- does not work. Login is kept in $_SESSION, but not my_data 
      exit; 
     } 
    break; 

Спасибо!

Эта тема может быть похожа на that one here, но мой $_SESSION не пуст после header(), но частично удален.

+0

его 'header ('Location: index.php? Action = survey_part2');' и dont 'unset ($ _ POST);' –

+0

Первое, что верно, я исправил его. В моем коде было уже хорошо. Использование unset ($ _ POST) или нет не оказывает никакого влияния. – BairDev

+0

Является 'session_start();' вызывается на вашей странице 'index.php? Action = survey_part2'? Кроме того, в конце вашего «контроллера» у вас есть «redirect» («index.php? Aktion = umfrage_2 & lang = de»); '- не должно быть' header ('Location: index.php? Action = survey_part2') ; ' – Shackrock

ответ

0

Теперь я поймал проблему. Я попытался сериализовать PDO с помощью save_items(), и через 1 день я нашел сообщение об ошибке. Мой намек на день: если можно, загляните в php_error_log, потому что иногда очень важное сообщение об ошибке не отображается на экране.

Так что мой вопрос относится к that one!

Решение: Поместите данные в виде массива в $ _SESSION или использовать __sleep() и __wakeup(), чтобы определить, какие атрибуты (не: $ дб = новый PDO();) должны быть сериализованы, а какие нет.

Смежные вопросы