Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' dalam Rentetan Bersiri PHP?

Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' dalam Rentetan Bersiri PHP?

DDD
Lepaskan: 2024-12-08 12:51:11
asal
393 orang telah melayarinya

How to Fix

Cara Membaiki Rentetan Bersiri yang Rosak dengan Panjang Kiraan Bait Tidak Sah

Pengenalan

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.

Mengapa Ralat Berlaku

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.

Pembetulan Pantas

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);
Salin selepas log masuk

Disyorkan Pendekatan

Selain pembetulan pantas, adalah penting untuk mengenal pasti punca siri yang salah. Pertimbangkan langkah berikut:

  • Pastikan petikan berganda (") dilarikan dengan betul, cth., gunakan petikan tunggal (').
  • Jika data mengandungi aksara UTF-8, gunakan array_map("utf8_encode", $data) untuk mengekodnya sebelum bersiri.
  • Gunakan pengekodan base64 untuk menukar data bersiri ke format selamat sebelum menyimpannya dalam pangkalan data:
$toDatabase = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting saved format
Salin selepas log masuk

Mengesan Ralat dalam Data Bersiri

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);
    // ...
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan