Был в этом в течение последних 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