Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' Disebabkan oleh Panjang Kiraan Bait yang Salah dalam Rentetan PHP Bersiri?
Cara Membaiki Rentetan Bersiri yang Rosak Kerana Panjang Kiraan Bait Yang Salah
Ralat "unserialize() [function.unserialize ]: Ralat pada offset" sering timbul apabila bekerja dengan bersiri rosak rentetan. Dalam kes ini, isu ini berpunca daripada panjang kiraan bait yang salah.
Memahami Masalah
Apabila PHP mensiri data, ia menyimpan panjang setiap elemen bersiri sebagai awalan. Jika panjang ini tidak tepat, PHP gagal menyahsiri rentetan dengan betul.
Pembetulan Pantas
Untuk menangani isu ini, kira semula panjang setiap elemen dalam tatasusunan bersiri menggunakan berikut kod:
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
Contoh:
$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:\fakepath0.jpg;"}'; var_dump(unserialize($data)); // Error var_dump(unserialize($recalculated_data)); // Correctly serialized
Cadangan:
Daripada bergantung pada pembaikan pantas, ia adalah penting untuk mengemas kini kod anda kepada:
Fungsi Pengesahan:
function findSerializeError($data1) { $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1); $max = max(strlen($data1), strlen($data2)); for ($i = 0; $i < $max; $i++) { if (@$data1[$i] !== @$data2[$i]) { return "Error at offset $i"; } } return true; }
Atas ialah kandungan terperinci Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' Disebabkan oleh Panjang Kiraan Bait yang Salah dalam Rentetan PHP Bersiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!