2011-12-09 95 views
7

在一個會話保存處理$數據的寫入功能的格式傳遞這樣的:

測試|一:1:{S:3: 「富」; S:3: 「巴」; }會話|一個:2:{S:10: 「isLoggedIn」; b:1; S:8: 「的clientId」; S:5: 「12345 」;}

有一種方法來轉換即到適當的數組這將是:

array 
(
    'test' => array 
    (
     'foo' => 'bar' 
    ) 
    'session' => array 
    (
     'isLoggedIn' => true 
     'clientId' => '12345' 
    ) 
) 

我想傳遞一個爲反序列化,但我得到的錯誤:

反序列化()[function.unserialize]:錯誤在偏移0 95字節

,它只是返回false。

+0

什麼會話保存處理函數看起來像? –

+0

請正確序列化字符串,不要使用一些自定義函數。 – NikiC

+0

如果這是原始字符串,那麼難怪反序列化失敗。它是畸形的。不要使用格式不正確的輸入。 –

回答

3
+0

'session_decode()'在該字符串上返回'false'。 –

+0

好吧,那是我想要的寫作然而,有沒有辦法將數組轉換爲讀取有效的會話字符串(請注意,我想將會話存儲爲mongodb中的數組,以便能夠更好地進行調試會話數據,如果我需要) – ryanzec

+0

有一些很好的例子[這裏](http://www.php.net/manual/en/function.session-encode.php) –

7

關於其他答案。 session_decode的描述是「session_decode()解碼數據中的會話數據,設置會話中存儲的變量」,聽起來並不像你所需要的那樣..並且它總是在解析字符串後返回bool。

另一方面,如果你提供的字符串作爲例子有一個錯誤,「12345」後面的空格(它看起來像一個錯誤,因爲在它前面你可以看到下面的值應該是一個字符串與長度5)你可以使用這個功能:

function unserialize_session_data($serialized_string) 
{ 
    $variables = array(); 
    $a = preg_split("/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

    for($i = 0; $i<count($a); $i = $i+2) 
    { 
     if(isset($a[$i+1])) 
     { 
       $variables[$a[$i]] = unserialize($a[$i+1]); 
     } 
    } 
    return($variables); 
} 
+0

這裏是一個鏈接,顯示這個例子的工作原理: http://codepad.org/32C0pwyZ – mishu

+1

我相信如果會話數據中已經有管道字符,這將不起作用。 – cgTag

+1

非常感謝你。至於| s。我在會話編碼過程之前替換了管道,或者無法正確保存。解碼後,我替換替換。 –