反序列化数据不起作用

时间:2013-04-29 14:25:53

标签: php wordpress serialization

过去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

从结果中可以看出,它只是删除了&#34; s:668:"&#34;从一开始就表示它是668个字符串,其余部分保持不变。

为什么反序列化不能正常工作?

3 个答案:

答案 0 :(得分:3)

您可以反序列化两次:

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

注意:使用update_user_meta时无需序列化,它会自动为您自动序列化,参见maybe_serializehttp://codex.wordpress.org/Function_Reference/maybe_serialize

答案 1 :(得分:3)

哎呀找到了答案! :)来自WP本身隐藏在functions.php中的WP功能。

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'] ));

以整齐的数组返回所有内容! :)

幸福快乐! :)

答案 2 :(得分:0)

我遇到了与自定义帖子类型序列化数据的wp_options相同的问题。 我想可能有一个字符集问题,事实上...... ta da! 试试这个:

SortedSet<String> set = new TreeSet<>();
set.add("JDMD");
set.add("YZX");
set.add("XYZ");
set.add("Work");
set.add("Home");

for(String s : set) {
    System.out.println(s);
}

其中$ atest [0]来自mysql。 希望这有帮助!

Aisfrond