Deserializar datos no funciona

He estado en esto durante las últimas 5 horas y estoy perplejo. Intenté las funciones más ridículas para intentar solucionarlo pero fue en vano.

Estoy recuperando datos de una base de datos de WP. Los datos tienen, antes del inserto, una matriz serializada usando la función serialize() de PHP. Luego se inserta en la base de datos WP usando la función WP update_user_meta . La referencia de esta función dice:

 $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 

Esto me hizo pensar que los datos pueden haber sido serializados dos veces. A pesar de pasar por un montón de funciones como unserialize() , array_map , json_decode y combinaciones de éstas y más, ahora tengo el siguiente:

 $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++; } 

Sin embargo, esto no funciona. Esto entra con $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 

Este es el resultado:

 string 'a:16:{s:2:"id";s:9:"123456";s:4:"name";s:12:"Henkie";s:10:"first_name";s:4: //and so on 

Como es visible desde el resultado, simplemente elimina la ” s:668:" “del inicio, lo que indica que es una cadena de 668 caracteres y deja el rest intacto.

¿Cómo es que la desinstalación no funciona correctamente?

Puedes deserializar dos veces:

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

NB: no es necesario serializar cuando se utiliza update_user_meta , se serializa automáticamente, cf. maybe_serialize : http://codex.wordpress.org/Function_Reference/maybe_serialize

¡Whoops encontró la respuesta! 🙂 Función de WP oculta en functions.php de 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; } 

Se corrigió la despersonalización haciendo:

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

¡Lo devuelve todo en una ordenada ordenación! 🙂

¡Feliz, feliz! 🙂

Tuve el mismo problema con wp_options donde los tipos de publicaciones personalizadas tienen datos de serialización. Me imagino que tal vez haya un problema de charset, y de hecho … ta da! Prueba esto:

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

Donde $ atest [0] es thearray de mysql. ¡Espero que esto ayude!

Aisfrond