WordPress — PHP несериализовать сериализованные данные

У меня проблема с десериализацией сериализованных данных.

Данные сериализуются и сохраняются в базе данных.

Эти данные содержат загруженный .csv URL, который я хочу вернуть в fgetcsv.

fgetcsv ожидает массив, а теперь задана строка, поэтому мне нужно десериализовать данные, но это приводит к ошибкам.

Я нашел это онлайн http://davidwalsh.name/php-serialize-unserialize-issues но это не похоже на работу. Поэтому я надеюсь, что кто-нибудь скажет мне, где я ошибаюсь:

Вот ошибка:

Notice: unserialize() [function.unserialize]: Error at offset 0 of 1 bytes in /xxx/public_html/multi-csv-upload.php on line 163

Я обнаружил, что это означает, что в сериализованных данных есть определенные символы, которые делают файл поврежденным после десериализации (",',:,;)

Строка 163:

jj_readcsv(unserialize ($value[0]),true);` // this reads the url of the uploaded csv and tries to open it.

Вот код, который делает сериализованные данные:

update_post_meta($post_id, 'mcu_csv', serialize($mcu_csv));

Это WordPress

Вот вывод:

echo '<pre>';
print_r(unserialize($value));
echo '</pre>';

Array
(
[0] => http://www.domain.country/xxx/uploads/2014/09/test5.csv
)

То, как я это вижу, здесь не должно быть ничего плохого.

У кого-нибудь есть идея, как я могу снять сериализацию, чтобы использовать ее?
Вот что я сделал, диванчик …

public function render_meta_box_content($post)
{

// Add an nonce field so we can check for it later.
wp_nonce_field('mcu_inner_custom_box', 'mcu_inner_custom_box_nonce');

// Use get_post_meta to retrieve an existing value from the database.
$value = get_post_meta($post->ID, 'mcu_images', true);

echo '<pre>';
print_r(unserialize($value));
echo '</pre>';

ob_start();
jj_readcsv(unserialize ($value[0]),true);
$link = ob_get_contents();
ob_end_clean();
$editor_id = 'my_uploaded_csv';

wp_editor( $link, $editor_id );$metabox_content = '<div id="mcu_images"></div><input type="button" onClick="addRow()" value="Voeg CSV toe" class="button" />';
echo $metabox_content;

$images = unserialize($value);

$script = "<script>
itemsCount= 0;";
if (!empty($images))
{
foreach ($images as $image)
{
$script.="addRow('{$image}');";
}
}
$script .="</script>";
echo $script;
}

function enqueue_scripts($hook)
{
if ('post.php' != $hook && 'post-edit.php' != $hook && 'post-new.php' != $hook)
return;
wp_enqueue_script('mcu_script', plugin_dir_url(__FILE__) . 'mcu_script.js', array('jquery'));
}

0

Решение

Вы пытаетесь получить доступ к первому элементу сериализованной строки:

jj_readcsv(unserialize ($value[0]),true);

Поскольку строки по сути являются массивами символов, вы пытаетесь десериализовать 1-й символ в сериализованной строке.

Вам нужно отменить сериализацию 1-го, а затем получить доступ к элементу массива:

//php 5.4+
jj_readcsv(unserialize ($value)[0],true);
//php < 5.4

$unserialized = unserialize ($value);
jj_readcsv($unserialized[0],true);

В качестве альтернативы, если существует только один элемент, не храните массив на 1-м месте, просто сохраните строку URL, которую не нужно сериализовать:

//save
update_post_meta($post_id, 'mcu_csv', $mcu_csv[0]);
//access
jj_readcsv($value, true);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]