Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Membetulkan Ralat 'unserialize(): Error at offset' dalam Rentetan Bersiri yang rosak?

Bagaimanakah Saya Boleh Membetulkan Ralat 'unserialize(): Error at offset' dalam Rentetan Bersiri yang rosak?

Patricia Arquette
Patricia Arquetteasal
2024-12-14 06:28:14685semak imbas

How Can I Fix

Membaiki Rentetan Bersiri yang Rosak: Menyelesaikan Ralat Kiraan Bait Tidak Sah

Masalah:

Anda mengalami ralat "unserialize( ) [function.unserialize]: Ralat pada offset" semasa cuba nyahsiri rentetan bersiri yang rosak. Ralat ini menunjukkan bahawa rentetan mengandungi panjang kiraan bait yang tidak sah, mengakibatkan pemangkasan data.

Punca:

Data bersiri tidak sah disebabkan pengiraan panjang elemen yang salah.

Cepat Betulkan:

Kira Semula Panjang Elemen: Kira panjang sebenar setiap elemen bersiri dan kemas kini nilai kiraan bait yang sepadan.

Sebagai contoh, pertimbangkan bersiri berikut rentetan:

$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";}';

Gunakan kod berikut untuk mengira semula dan membetulkan elemen panjang:

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);

Pastikan Petikan yang Betul: Gunakan petikan tunggal (') dan bukannya petikan berganda (") apabila memberikan nilai kepada elemen bersiri, kerana yang terakhir boleh menyebabkan pemangkasan yang tidak dijangka.

Tambahan Langkah berjaga-jaga:

  • Tambah garis miring pada nilai menggunakan addslashes() sebelum bersiri untuk mengelakkan serangan suntikan SQL.
  • Enkodkan aksara UTF-8 menggunakan utf8_encode() untuk keserasian merentas platform .
  • Pertimbangkan untuk menggunakan base64_encode() dan base64_decode() untuk penyimpanan pangkalan data yang lebih selamat dan mendapatkan semula data bersiri.

Kesan Ralat Pensirian pada Masa Hadapan:

Fungsi berikut boleh digunakan untuk mengenal pasti elemen perbezaan panjang dan membantu mencari punca rasuah:

function findSerializeError($data1) {
    // ... (code omitted for brevity)
}

Dengan menggunakan fungsi ini, anda boleh menganalisis data yang rosak, mengenal pasti elemen yang bermasalah dan membetulkannya dengan sewajarnya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membetulkan Ralat 'unserialize(): Error at offset' dalam Rentetan Bersiri yang rosak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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