
日期:2008-06-20 作者:喜騰小二 來源:PHPChina
最近在做土人聯盟的時候,發現的關於unserialize函式的一些問題記錄一下。
個人Blog的設定資訊是serialize一個陣列儲存在一個欄位中的,陣列結構為
$message = Array
(
’sitename’ => “土人’部落”,
’siteisclose’ => 1,
’siteblogdetail’ => ‘0′,
’sitestyle’ => ‘brown’,
’sitetemplate’ => ‘default”‘,
’siteblognum’ => 8,
’sitedescription’ => ‘用土人的心態去感悟多元化的社會,分享自己獨特的理念。’,
’sitetitlekeywords’ => ‘發現生活,感受生活,分享生活,享受生活。’,
’sitemetakeywords’ => ‘土人,土人部落,土人社區,土人景觀’,
’sitemetadescription’ => ‘用土人的心態去感悟多元化的社會,分享自己獨特的理念。’,
‘uid’ => 1,
‘nickname’ => ‘土豆男’,
’site’ => ”,
’sitetype’ => 1,
’starttime’ => 1191074174,
‘lasttime’ => 1191629784,
‘totleviews’ => 14,
‘totleblogs’ => 3
);
由於程式自動判斷了magic_quotes_gpc並將所有POST,GET的資料自動轉義(addslashes下),所以上麵陣列中的$message['sitename']在入庫之前就變成了土人’部落,當進入mysql資料庫的儲存的時候,儲存的內容依然是 土人’部落(不要問我’怎麼入mysql庫以後就變成了’ 這是mysql的轉義特性,絕大多數資料庫也都是靠來轉義的),這時候是沒有問題的。
當從資料庫中查出這個欄位,然後unserialize的時候問題就來了,由於從資料庫中查出來的是沒有轉義的 土人’部落 這個值,於是在unserialize的時候就會失敗。
想了幾種解決方式:
第一,將此陣列不再存在一個欄位內,每個key獨立存在一個欄位內,此種被排除,係統已經跑起來了,改起來麻煩的說。
第二,將資料在存入mysql之前對serialize的陣列再addslashes下,這時候存入mysql的就是 土人’部落 了,但是資料庫查出來unserialize之後的資料還是 土人’部落 所以需要再次對此陣列逐一stripslashes。
第三,放鍥使用者體驗吧:) ,不允許’/”出現在,有了就自動取代掉