2014-09-24 6 views
0

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

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

Эти данные содержат загруженный URL-адрес .csv, который я хочу вернуть 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 

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

Строка 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')); 
} 

ответ

1

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

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

в виде строк, по существу, массивы символов, вы пытаетесь десериализируются 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); 
+0

Спасибо. Для объяснения и это сработало. FYI массив будет заполнен большим количеством URL-адресов csv для файлов. – Interactive

+0

@Interactive Glad я мог бы помочь. И да, я ожидал, что есть причина для использования массивов, но на всякий случай добавлен более поздний код. – Steve

Смежные вопросы