unserialize() [function.unserialize]: Error at offset
adalah karena invalid serialization data
karena panjang tidak valid
Perbaikan Cepat
Yang bisa Anda lakukan adalah recalculating the length
elemen dalam array serial
Data serial Anda saat ini
$data = 'a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15:"submit_comments";s:4:"open";s:5:"image";s:19:"C:fakepath100.jpg";}';
Contoh tanpa perhitungan ulang
var_dump(unserialize($data));
Keluaran
Notice: unserialize() [function.unserialize]: Error at offset 337 of 338 bytes
Menghitung ulang
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data);
var_dump(unserialize($data));
Keluaran
array
'submit_editorial' => boolean false
'submit_orig_url' => string 'www.bbc.co.uk' (length=13)
'submit_title' => string 'No title found' (length=14)
'submit_content' => string 'dnfsdkfjdfdf' (length=12)
'submit_category' => int 2
'submit_tags' => string 'bbc' (length=3)
'submit_id' => boolean false
'submit_subscribe' => int 0
'submit_comments' => string 'open' (length=4)
'image' => string 'C:fakepath100.jpg' (length=17)
Rekomendasi .. Saya
Alih-alih menggunakan perbaikan cepat semacam ini ... saya sarankan Anda memperbarui pertanyaan dengan
-
Bagaimana Anda membuat serial data Anda
-
Bagaimana Anda Menyimpannya ..
================================EDIT 1 =================================
Kesalahan
Kesalahan dibuat karena penggunaan tanda kutip ganda "
sebagai gantinya kutipan tunggal '
itulah sebabnya C:\fakepath\100.png
telah diubah menjadi C:fakepath100.jpg
Untuk memperbaiki kesalahan
Anda perlu mengubah $h->vars['submitted_data']
Dari (Perhatikan singe cukup '
)
Ganti
$h->vars['submitted_data']['image'] = "C:\fakepath\100.png" ;
Dengan
$h->vars['submitted_data']['image'] = 'C:\fakepath\100.png' ;
Filter Tambahan
Anda juga dapat menambahkan filter sederhana ini sebelum Anda memanggil serialize
function satitize(&$value, $key)
{
$value = addslashes($value);
}
array_walk($h->vars['submitted_data'], "satitize");
Jika Anda memiliki Karakter UTF, Anda juga dapat menjalankan
$h->vars['submitted_data'] = array_map("utf8_encode",$h->vars['submitted_data']);
Cara mendeteksi masalah pada data serial di masa mendatang
findSerializeError ( $data1 ) ;
Keluaran
Diffrence 9 != 7
-> ORD number 57 != 55
-> Line Number = 315
-> Section Data1 = pen";s:5:"image";s:19:"C:fakepath100.jpg
-> Section Data2 = pen";s:5:"image";s:17:"C:fakepath100.jpg
^------- The Error (Element Length)
findSerializeError
Fungsi
function findSerializeError($data1) {
echo "<pre>";
$data2 = preg_replace ( '!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'",$data1 );
$max = (strlen ( $data1 ) > strlen ( $data2 )) ? strlen ( $data1 ) : strlen ( $data2 );
echo $data1 . PHP_EOL;
echo $data2 . PHP_EOL;
for($i = 0; $i < $max; $i ++) {
if (@$data1 {$i} !== @$data2 {$i}) {
echo "Diffrence ", @$data1 {$i}, " != ", @$data2 {$i}, PHP_EOL;
echo "\t-> ORD number ", ord ( @$data1 {$i} ), " != ", ord ( @$data2 {$i} ), PHP_EOL;
echo "\t-> Line Number = $i" . PHP_EOL;
$start = ($i - 20);
$start = ($start < 0) ? 0 : $start;
$length = 40;
$point = $max - $i;
if ($point < 20) {
$rlength = 1;
$rpoint = - $point;
} else {
$rpoint = $length - 20;
$rlength = 1;
}
echo "\t-> Section Data1 = ", substr_replace ( substr ( $data1, $start, $length ), "<b style=\"color:green\">{$data1 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
echo "\t-> Section Data2 = ", substr_replace ( substr ( $data2, $start, $length ), "<b style=\"color:red\">{$data2 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
}
}
}
Cara yang lebih baik untuk menyimpan ke Database
$toDatabse = base64_encode(serialize($data)); // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format