2

在过去的 5 个小时里一直在这,我很难过。尝试了最荒谬的功能来尝试修复它,但无济于事。

我正在从 WP 数据库中检索数据。在插入之前,数据已经使用serialize()PHP 中的函数序列化了 1 个数组。然后使用 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_map,json_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 个字符的字符串,其余部分保持不变。

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

4

3 回答 3

5

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

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

开心快乐!:)

于 2013-04-29T15:03:00.890 回答
3

您可以反序列化两次:

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

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

于 2013-04-29T14:34:28.957 回答
0

我对 wp_options 有同样的问题,其中自定义帖子类型具有序列化数据。我认为可能存在字符集问题,实际上...... ta da!试试这个:

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

其中 $atest[0] 是来自 mysql 的数组。希望这可以帮助!

艾斯弗朗德

于 2016-01-09T10:44:28.123 回答