【问题标题】:Unserializing data doesn't work反序列化数据不起作用
【发布时间】:2013-04-23 06:25:03
【问题描述】:

在过去的 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 个字符的字符串,其余部分保持不变。

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

【问题讨论】:

    标签: php wordpress serialization


    【解决方案1】:

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

      你可以反序列化两次:

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

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

      【讨论】:

      • 是的,我想,但是反序列化两次并没有给我任何回报。此外,使用预先创建的数据,改变它为时已晚。
      • 尝试在jsonlint.com 将字符串验证为 JSON,看看它告诉你什么?
      • Interesting site ;) 但是不,它不会将其识别为 JSON。虽然完全开放的想法,但真的不想手动重新创建 10.000 多条记录。
      【解决方案3】:

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

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

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

      艾斯弗朗德

      【讨论】:

      • 我发现使用 WP 自己的maybe_unserialize($var) 比只使用unserialize() 效果更好。如下my answer所示,检查数组是否被序列化,否则返回原样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2020-09-11
      • 2018-02-02
      • 2020-10-16
      • 2012-09-18
      • 1970-01-01
      相关资源
      最近更新 更多