2010-11-24 56 views
4

我在我的應用程序這個功能:反序列化有時會返回錯誤

public function direct($theTree) 
{ 
    $aTreeRoot = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $theTree); 
    return unserialize($aTreeRoot); 
} 

絕不應該返回false,但在錯誤日誌中的錯誤不斷髮生的歷史它說,它返回false。

但是,我不能在我的應用程序中複製錯誤。我嘗試盡一切可能,但它始終有效。

功能有問題嗎?

$theTree來自會議。

編輯:正則表達式是因爲:unserialize - 在評論中搜索我的正則表達式。它應該解決一個問題。

+0

這是preg_replacing真的有必要嗎?這個Igor字符給出的例子提示這個解決方法是一個完全無效的序列化字符串。我沒有意識到有必要這樣做的任何錯誤。如果你的字符串是用`serialize`序列化的並且沒有被修改,它應該``反序列化`就好了。你是否自己遇到過這個問題,或者你是否因爲「它應該解決一個問題」而放入它? – deceze 2010-11-24 07:38:28

+0

@deceze:是的,沒有那個正則表達式,反序列化不起作用。我將一個複雜的對象放入序列化的會話中,如果沒有正則表達式,就會出現反序列化的問題。正則表達式解決了這個問題,但它似乎反序列化有時會返回錯誤。 – 2010-11-24 07:40:43

+0

三重檢查你的序列化字符串不會在某處找到任何額外的字符,改變編碼等。你可以給出一個失敗的例子嗎? – deceze 2010-11-24 07:43:21

回答

37

我以前遇到過類似的問題。我告訴你我是如何解決它的。

你序列數據後,申請BASE64_ENCODE() e.g

$txt = base64_encode(serialize($txt)); 

當你反序列化它

例如

$txt = unserialize(base64_decode($txt)); 

試試這個。希望爲你工作。祝你好運

1

magic_quotes_gpc的值是否與生產和本地計算機上的值相同?

1

我的代碼有一些隨機行爲,但我想我找到了原因。我使用的是UTF-8字符集,而在我的生產服務器中,似乎產生了這些問題。 試試這個:

$txt = unserialize(utf8_encode($aTreeRoot)); 

爲我工作,希望它會爲你太

0

我相信逃避你序列化也將工作作爲一種替代爲base64數據。

$data = serialize($results); 
$encoded = htmlentities($data); 
echo '<input type="hidden" name="data" value="'.$encoded.'">';