2013-04-29 74 views
2

過去5個小時一直在這裏,我很難過。嘗試了最荒謬的功能來嘗試修復它,但無濟於事。反序列化數據不起作用

我正在從WP數據庫檢索數據。在插入之前,數據具有使用PHP的serialize()函數序列化的1個數組。然後使用WP功能update_user_meta將其插入WP數據庫。 This function的參考說:

$meta_value 
(mixed) (required) The new desired value of the meta_key, which must be different from the 
existing value. Arrays and objects will be automatically serialized. 
Note that using objects may cause this bug to popup. 
    Default: None 

這使我想到數據可能已被序列化兩次。雖然通過了一大堆的功能,如unserialize()array_mapjson_decode去,以及它們的組合,更我現在已經得到了如下:

$i = 0; 
while($i < count($fbData)){ 

    $someValue = $fbData[$i]['meta_value']; 
    $usermeta = array_map(function($a){ return $a[0]; }, get_user_meta($fbData[$i]['user_id'])); 
    if($usermeta['facebookmeta']){ 
     $unserialized = unserialize($usermeta['facebookmeta']); 
     //other methods tried: unserialize(unserialize 
     // unserialize(json_decode(
     // json_decode(unserialize(json_decode(
     // json_decode(unserialize(
     // unserialize(array_map( 
     // unserialize(array_map(json_decode 
     // whole lot others 
     var_dump($unserialized); 
    } 
$i++; 
} 

然而,這是行不通的。這正好與$fbData

'facebookmeta' => string 's:668:"a:16:{s:2:"id";s:9:"123456";s:4:"name";s:12:"Henkie";s:10:"first_name";s:4 //and so on 

這是結果:

string 'a:16:{s:2:"id";s:9:"123456";s:4:"name";s:12:"Henkie";s:10:"first_name";s:4: //and so on 

由於可見它的結果,它只是刪除了從一開始,這表明「s:668:"」這是一個668字符串,並保持其餘部分不變。

非序列化如何正常工作?

回答

2

哎呦找到了答案! :) WP功能隱藏在WP自己的functions.php中。

function maybe_unserialize($original) { 
    if (is_serialized($original)) // don't attempt to unserialize data that wasn't serialized going in 
     return @unserialize($original); 
    return $original; 
} 

做修正了反序列化:

$unserialized = maybe_unserialize(unserialize($usermeta['facebookmeta'])); 

返回這一切在一個整潔的陣! :)

幸福快樂! :)

3

你可以反序列化兩次:

$unserialized = unserialize(unserialize($usermeta['facebookmeta']));

注:有沒有必要使用update_user_meta時,序列化,它自動爲您連載,比照maybe_serializehttp://codex.wordpress.org/Function_Reference/maybe_serialize

+0

是的我想,但是反序列化兩次沒有給我什麼回報。另外,處理預先創建的數據,太遲以至於無法改變這一點。 – Nukeface 2013-04-29 14:35:41

+0

嘗試在http://jsonlint.com/驗證字符串爲JSON並查看它告訴你什麼? – diggy 2013-04-29 14:51:34

+0

有趣的網站;)不過,它並不認爲它是JSON。完全開放的想法,但真的不想手動重新創建10.000+記錄。 – Nukeface 2013-04-29 14:56:09

0

我有同樣的問題與wp_options自定義帖子類型已序列化數據。 我認爲,也許有一個字符集問題,事實上...達大! 試試這個:

$unserialized = unserialize(utf8_encode($atest[0]['option_value'])); 

其中$ ATEST [0]是thearray從MySQL。 希望這有助於!

Aisfrond

+0

我發現使用WP自己的'maybe_unserialize($ var)'比只使用'unserialize()'效果更好。如下面的[我的答案](http://stackoverflow.com/a/16281985/1155833)所示,它檢查數組是否被序列化,否則返回數據不變。 – Nukeface 2016-01-11 12:23:24