Apabila berurusan dengan data bersiri, ralat mungkin akan berlaku "unserialize() [function.unserialize]: Ralat pada offset." Ralat ini biasanya berlaku disebabkan oleh data bersiri yang tidak sah disebabkan oleh panjang kiraan bait yang salah.
Semasa penyirian, PHP mengira panjang setiap elemen dalam tatasusunan bersiri menggunakan strlen( ) fungsi. Walau bagaimanapun, jika data mengandungi aksara, seperti petikan berganda, yang memerlukan pengendalian khas (cth., melarikan diri), kiraan bait mungkin menjadi tidak betul.
Untuk menangani ralat ini, ia adalah diperlukan untuk mengira semula panjang setiap elemen dalam tatasusunan bersiri secara manual:
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
Selain pembetulan pantas, adalah penting untuk mengenal pasti punca siri yang salah. Pertimbangkan langkah berikut:
$toDatabase = base64_encode(serialize($data)); // Save to database $fromDatabase = unserialize(base64_decode($data)); //Getting saved format
Walaupun mesej ralat memberikan petunjuk umum masalah, ia adalah sering membantu untuk menentukan lokasi sebenar data yang rosak Untuk melakukan ini, gunakan fungsi findSerializeError, yang membandingkan dua rentetan bersiri dan mengenal pasti perbezaan antara mereka, termasuk kiraan bait yang salah:
function findSerializeError($data1) { echo "<pre class="brush:php;toolbar:false">"; $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1); // ... }
Dengan memberikan maklumat terperinci tentang ralat, fungsi ini membantu mengenal pasti dan menyelesaikan isu bersiri.
Atas ialah kandungan terperinci Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' dalam Rentetan Bersiri PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!