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

これにより、データが2回シリアル化された可能性があると思いました。、 、 、およびこれらの組み合わせなど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 文字の文字列であることを示し、残りはそのまま残します。

アンシリアライゼーションが正しく機能しないのはなぜですか?

4

3 に答える 3

5

おっと、答えが見つかりました!:) 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'] ));

すべてをきちんとした配列で返します! :)

幸せ!:)

于 2013-04-29T15:03:00.890 に答える
3

シリアル化を 2 回解除できます。

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

注意: を使用する場合update_user_meta、シリアライズする必要はありません。自動的にシリアライズされます。maybe_serialize: http://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 に答える