2013-05-11 3 views
0

꽤 작은 응용 프로그램을 설정하는 데 문제가 있습니다. 그것은 조금 조사 일 것입니다.PHP : header() + 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; 
    } 
} 

I unset($_POST)과 같이 리디렉션 :

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

문제점 : 리디렉션 후 이전에 저장된 로그인 데이터는 여전히 $_SESSION이지만,입니다. 0은 그렇지 않습니다. 리디렉션을 피하면 리디렉션이 시작되기 전에 이 $_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이 비어 있지 않지만 부분적으로 삭제되었습니다.

+0

그것의'header ('Location : index.php? action = survey_part2'); 그리고하지 말아라 ($ _ POST); –

+0

첫 번째 사항은 사실이다. 이미 내 코드에서 괜찮 았어. unset ($ _ POST)을 사용했는지 여부는 영향을 미치지 않습니다. – BairDev

+0

''index.php? action = survey_part2'' 페이지에서'session_start();'가 호출되고 있습니까? 또한, "컨트롤러"의 끝에서'redirect ('index.php? aktion = umfrage_2 & lang = de'); - 헤더 ('Location : index.php? action = survey_part2')가되어서는 안됩니다. ; ' – Shackrock

답변

0

이제 문제를 해결했습니다. save_items()로 PDO를 직렬화하려고 시도한 후 1 일 후에 오류 메시지를 발견했습니다. 내 요령 : 가능한 경우, 매우 중요한 오류 메시지가 화면에 표시되지 않기 때문에 php_error_log를 살펴보십시오.

그래서 내 문제가 that one!

솔루션 관련되었다 : $ _SESSION으로 배열로 데이터를 넣어 또는 속성을 지정할 __wakeup() (__sleep 사용)와 (하지 : $ dB = 새로운 PDO();) 직렬화되어야하며 직렬화되지 않아야합니다.

관련 문제