Несериализованные данные не работают

Был в этом в течение последних 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_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 с $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 символов и оставляет оставшуюся нетронутой.

Как происходит неэтериализация не работает должным образом?

Вы можете выполнить несериализацию дважды:

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

NB: update_user_meta сериализуется при использовании update_user_meta , он автоматически сериализуется для вас, ср. maybe_serialize : http://codex.wordpress.org/Function_Reference/maybe_serialize

Упс нашел ответ! 🙂 Функция 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'] )); 

Возвращает все это в аккуратном массиве! 🙂

Счастлив счастлив! 🙂

У меня была та же проблема с wp_options, где пользовательские типы сообщений сериализуют данные. Я полагаю, что, возможно, проблема с кодировкой, и на самом деле … та да! Попробуй это:

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

Где $ atest [0] является аргументом из mysql. Надеюсь это поможет!

Aisfrond