2014-12-25 2 views
0

Я не читаю строку ниже строки, но ничего не возвращаю.unserialize in php не возвращает никакого значения

: с 57: {s: 10: "THEME_NAME"; s: 5: "зеленый"; s: 16: "PUBLIC_ADS_LIMIT"; s: 1: "5"; s: 17: "PUBLIC_EDIT_LIMIT" ; s: 1: "5", s: 8:;: 10: "Abcdubai"; s: "SITENAME" s 5: ";}

+1

Там, кажется, разрыв строки после ': с 57:'. Это и в исходном коде? Кроме того, если вы просто эхом отдаете результат, вы можете упустить тот факт, что при ошибке 'unserialize()' возвращает 'false'. Проверьте, что именно возвращает функция с помощью 'var_dump()' например. – Boaz

+0

'Примечание: unserialize(): Ошибка при смещении 132 из 144 байтов' не забудьте отобразить все ошибки, и вы увидите уведомление – codinginsane

+1

возможный дубликат [unserialize() \ [function.unserialize \]: ошибка со смещением] (http://stackoverflow.com/questions/10152904/unserialize-function-unserialize-error-at-offset) – Neo

ответ

1

вы десериализации данные неправильно

a:57{s:10:"THEME_NAME";s:5:"green";s:16:"PUBLIC_ADS_LIMIT";s:1:"5";s:17:"PUBLIC_EDIT_LIMIT";s:1:"5";s:8:"SITENAME";s:10:"Abcdubai";s:5:";} 

если вы пытаетесь десериализируются его сообщения об ошибках E_ALL вы увидите уведомление

$data = 'a:57{s:10:"THEME_NAME";s:5:"green";s:16:"PUBLIC_ADS_LIMIT";s:1:"5";s:17:"PUBLIC_EDIT_LIMIT";s:1:"5";s:8:"SITENAME";s:10:"Abcdubai";s:5:";}'; 

var_dump($data); 

вы получите

Notice: unserialize(): Error 

потому

  • a:57 длина массива и из данных, которые вы должны это явно не 57.

  • s: указывает на длину строки s:10:"Abcdubai" Строка Abcdubai не в длину 10 это 8, так что вам нужно изменить, что s:8:"Abcdubai"

  • Наконец, вы должны s:5:"; в конце той же причине s:5 означает строка 5 символов в длину, и это пустой с одной двойной кавычки

    <?php 
    // this the valid data 
    $data = 'a:4:{s:10:"THEME_NAME";s:5:"green";s:16:"PUBLIC_ADS_LIMIT";s:1:"5";s:17:"PUBLIC_EDIT_LIMIT";s:1:"5";s:8:"SITENAME";s:8:"Abcdubai";}'; 
    
    $data = unserialize($data); 
    
    // accessing the valid serialized data 
    echo $data['THEME_NAME']; 
    echo $data['PUBLIC_ADS_LIMIT']; 
    echo $data['PUBLIC_EDIT_LIMIT']; 
    echo $data['SITENAME']; 
    

вы можете попробовать этот метод т о решении форматирования выдает

function fixUnserializeFormatting($data){ 
     // fix string length (will fix s:) 
     $data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data); 
     // remove empty matches with one double qoute 
     $data = preg_replace('/s\:+[0-9]+\:";/i', '', $data); 

     // trying to get the right array length 
     $strings = substr_count($data,';')/2;   
     // fixing array length 
     $data = preg_replace('/^a:+[0-9]+:/i', "a:{$strings}:", $data); 

     // finally returning the formatted data 
     return $data;  
    } 

Использование

$data = 'a:57:{s:10:"THEME_NAME";s:5:"green";s:16:"PUBLIC_ADS_LIMIT";s:1:"5";s:17:"PUBLIC_EDIT_LIMIT";s:1:"5";s:8:"SITENAME";s:10:"Abcdubai";s:5:";}'; 

    $data = fixUnserializeFormatting($data); 

    var_dump(unserialize($data));  
Смежные вопросы