Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' Disebabkan oleh Panjang Kiraan Bait yang Salah dalam Rentetan PHP Bersiri?

Bagaimana untuk Membetulkan 'unserialize(): Ralat pada offset' Disebabkan oleh Panjang Kiraan Bait yang Salah dalam Rentetan PHP Bersiri?

Barbara Streisand
Barbara Streisandasal
2024-12-22 19:10:14966semak imbas

How to Fix

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:

  • Gunakan petikan tunggal untuk nilai rentetan dan bukannya petikan berganda untuk mengelakkan konflik dengan pemisah laluan.
  • Pertimbangkan untuk menggunakan pengekodan base64 sebelum menyimpan data bersiri ke pangkalan data dan menyahkodnya sebelum dinyahsiri.
  • Sertakan fungsi untuk mengesahkan integriti rentetan bersiri sebelum penyahserikatan (disediakan dalam contoh di bawah).

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!

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