2013-02-20 44 views
0

我使用$_SESSION來存儲多頁形式的數據。在我完成提交併結束會話之前,所有內容都工作得非常好,以防止在該人嘗試重新輸入表單時防止複製相同的表單數據。當表單完成並提交,終止會話和清除會話數據:

$_SESSION = array(); 

setcookie(session_name(), '', time() - 42000); 

session_destroy(); 

以下是這樣的:

<?php 
session_start(); 

include "connect-moo.php"; 
$learning = true; 

//get any post variables and save them to the session 
foreach ($_POST as $key => $val) { 
$_SESSION[$key] = $val; 
} 

sessionDump(); //dumps session to db 

//check to see if step is set (in the post eg ?step=getaquote). If not, set it to current session step 

if(!isset($_POST["step"])) { 
if(isset($_SESSION['step'])) { 
    $_POST['step'] = $_SESSION['step']; 
} 
} 

//show the page appropriate to the current step 
if ($_SESSION['mode'] == 'edit' && $_SESSION['lastpage'] != "review" && $_SESSION['step'] != "session") { 
$_SESSION['lastpage'] = 'review'; 
getReview();  
} 
else { 
if($_SESSION['step'] != 'session') $_SESSION['lastpage'] = $_SESSION['step']; 

switch ($_POST["step"]) 
{ 

    case "session": 

     foreach($_SESSION as $key => $val){ 
      echo $key.": ".$val."<br>"; 
      //phpinfo(); 

     } 

     echo "Post Data<br>"; 
     foreach($_POST as $key => $val) { 
      $sval = mysql_real_escape_string($val); 
      $skey = mysql_real_escape_string($key); 
      echo $skey.": ".$sval."<br>"; 

     } 

     break; 

    case "getaquote": 

     getAQuote(); 
    break; 

    // and so on... 

      default: 
     start(); 
} 
} 

... (all of the abovementioned functions) 


?> 

我已經證實,一個新的會話cookie被建立,但$_POST$_SESSION重新啓動會話後爲空。使用最近的修復(謝謝!),我可以以編程方式將數據推入$ _POST和$ _SESION數組(例如$ _POST ['foo'] ='bar';),但通過URI傳遞的變量將被忽略。

我真的很感激任何想法。什麼可能會起來。

SOLUTIONS:

重新session_destroy,正確的代碼,如由Alex乙指出的那樣,是:

session_start(); 
session_unset(); 
session_destroy(); 
session_write_close(); 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 

重。 $ _POST問題 - 事實證明,當通過URL直接輸入信息時,服務器正確地將其解釋爲GET而不是POST。我修改了我的代碼以獲取所有GET & POST數據,但只會在生產中需要POST。這裏的新代碼:

//get any submitted variables and save them to the session 
foreach ($_GET as $key => $val) { 
$_SESSION[$key] = $val; 
} 
foreach ($_POST as $key => $val) { 
$_SESSION[$key] = $val; 
} 

感謝您的幫助!

+2

他們_are_空或_aren't_?我是唯一一個被措詞混淆的人嗎? – 2013-02-20 20:54:34

+0

需要查看更多代碼,更具體地說,不工作的部分。 – Mike 2013-02-20 20:55:49

+0

@ColinMorelli我認爲「沒有」不應該在那裏。 – 2013-02-20 20:58:32

回答

0

你做錯了。

session_destroy()銷燬所有與當前會話相關的數據。它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話Cookie。要再次使用會話變量,必須調用session_start()

爲了完全消滅會話,就像登錄用戶一樣,會話ID也必須取消設置。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此。

解決辦法:

session_start(); 
session_unset(); 
session_destroy(); 
session_write_close(); 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 
+1

「0」的Cookie過期意味着「在瀏覽器關閉之前」。 – Mike 2013-02-20 21:08:51

+0

謝謝 - 所以,$ _SESSION是整理出來,我可以存儲數據。但是$ _POST仍然不接受任何東西。 – o2fill 2013-02-20 21:13:43