反序列化数据不起作用(Unserializing data doesn't work)

2019-09-01 09:21发布

这已经在过去的5小时,我难倒。 试过最可笑的功能,试图修复它,但无济于事。

我从WP数据库中检索数据。 数据已,插入之前,有1个阵列使用串行化serialize()从PHP功能。 然后,它被使用WP功能插入到WP数据库update_user_meta 。 这个函数的引用说:

$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字符串并留下其余不变。

怎么会在反序列化不能正常工作?

Answer 1:

你可以反序列化两次:

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

注意:有没有必要使用时,序列化update_user_meta ,它自动为您连载,比照 maybe_serialize : http://codex.wordpress.org/Function_Reference/maybe_serialize



Answer 2:

哎呦找到了答案! :) 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'] ));

返回这一切在一个整洁的阵! :)

开心快乐! :)



Answer 3:

我曾与wp_options其中自定义文章类型具有串行数据同样的问题。 我有身材,也许有一个字符集问题,而事实上...ただ! 试试这个:

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

其中$ ATEST [0]是thearray从MySQL。 希望这可以帮助!

Aisfrond



文章来源: Unserializing data doesn't work