Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Membetulkan Ralat `unserialize()` PHP: Kiraan Byte Salah dalam Data Bersiri?

Bagaimana untuk Membetulkan Ralat `unserialize()` PHP: Kiraan Byte Salah dalam Data Bersiri?

Susan Sarandon
Susan Sarandonasal
2024-12-27 19:51:12407semak imbas

How to Fix PHP's `unserialize()` Error: Incorrect Byte Count in Serialized Data?

Cara Membaiki Data Bersiri Yang Rosak Akibat Panjang Kiraan Bait Yang Salah

Pengenalan

Bila menggunakan fungsi unserialize() dalam PHP, anda mungkin menghadapi ralat unserialize() [function.unserialize]: Ralat pada offset. Ralat ini biasanya menunjukkan bahawa data bersiri rosak atau mempunyai panjang kiraan bait yang salah. Isu ini timbul apabila panjang elemen dalam tatasusunan bersiri tidak dikira dengan betul.

Pembetulan Pantas

Untuk menyelesaikan isu ini, kira semula panjang elemen dalam tatasusunan bersiri. Ini boleh dilakukan menggunakan ungkapan biasa. Contohnya:

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

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

Contoh

Tanpa pengiraan semula:

var_dump(unserialize($data));

Output:

Notice: unserialize() [function.unserialize]: Error at offset 337 of 338 bytes

Dengan pengiraan semula:

var_dump(unserialize($data));

Output:

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)

Cadangan

Daripada menggunakan pembaikan sementara, ia sangat disyorkan untuk mengenal pasti punca rasuah. Ini mungkin melibatkan semakan cara data disiri dan disimpan.

Pertimbangan Tambahan

  • Gunakan petikan tunggal (') dan bukannya petikan berganda (") apabila bersiri data untuk mengelakkan isu dengan aksara yang dilepaskan.
  • Gunakan fungsi sanitasi (mis., addslashes()) untuk melepaskan aksara khas.
  • Pertimbangkan untuk menggunakan mekanisme pesirilan data alternatif seperti JSON, yang kurang terdedah kepada jenis rasuah ini.
  • Laksanakan mekanisme untuk mengesan ralat penyirian dengan membandingkan panjang data asal dan dikira semula.

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Ralat `unserialize()` PHP: Kiraan Byte Salah dalam Data Bersiri?. 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