Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara memperbaiki string serial yang telah rusak oleh panjang jumlah byte yang salah?

unserialize() [function.unserialize]: Error at offset adalah karena invalid serialization data karena panjang tidak valid

Perbaikan Cepat

Yang bisa Anda lakukan adalah recalculating the length elemen dalam array serial

Data serial Anda saat ini

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

Contoh tanpa perhitungan ulang

var_dump(unserialize($data));

Keluaran

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

Menghitung ulang

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

Keluaran

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)

Rekomendasi .. Saya

Alih-alih menggunakan perbaikan cepat semacam ini ... saya sarankan Anda memperbarui pertanyaan dengan

  • Bagaimana Anda membuat serial data Anda

  • Bagaimana Anda Menyimpannya ..

================================EDIT 1 =================================

Kesalahan

Kesalahan dibuat karena penggunaan tanda kutip ganda " sebagai gantinya kutipan tunggal ' itulah sebabnya C:\fakepath\100.png telah diubah menjadi C:fakepath100.jpg

Untuk memperbaiki kesalahan

Anda perlu mengubah $h->vars['submitted_data'] Dari (Perhatikan singe cukup ' )

Ganti

 $h->vars['submitted_data']['image'] = "C:\fakepath\100.png" ;

Dengan

 $h->vars['submitted_data']['image'] = 'C:\fakepath\100.png' ;

Filter Tambahan

Anda juga dapat menambahkan filter sederhana ini sebelum Anda memanggil serialize

function satitize(&$value, $key)
{
    $value = addslashes($value);
}

array_walk($h->vars['submitted_data'], "satitize");

Jika Anda memiliki Karakter UTF, Anda juga dapat menjalankan

 $h->vars['submitted_data'] = array_map("utf8_encode",$h->vars['submitted_data']);

Cara mendeteksi masalah pada data serial di masa mendatang

  findSerializeError ( $data1 ) ;

Keluaran

Diffrence 9 != 7
    -> ORD number 57 != 55
    -> Line Number = 315
    -> Section Data1  = pen";s:5:"image";s:19:"C:fakepath100.jpg
    -> Section Data2  = pen";s:5:"image";s:17:"C:fakepath100.jpg
                                            ^------- The Error (Element Length)

findSerializeError Fungsi

function findSerializeError($data1) {
    echo "<pre>";
    $data2 = preg_replace ( '!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'",$data1 );
    $max = (strlen ( $data1 ) > strlen ( $data2 )) ? strlen ( $data1 ) : strlen ( $data2 );

    echo $data1 . PHP_EOL;
    echo $data2 . PHP_EOL;

    for($i = 0; $i < $max; $i ++) {

        if (@$data1 {$i} !== @$data2 {$i}) {

            echo "Diffrence ", @$data1 {$i}, " != ", @$data2 {$i}, PHP_EOL;
            echo "\t-> ORD number ", ord ( @$data1 {$i} ), " != ", ord ( @$data2 {$i} ), PHP_EOL;
            echo "\t-> Line Number = $i" . PHP_EOL;

            $start = ($i - 20);
            $start = ($start < 0) ? 0 : $start;
            $length = 40;

            $point = $max - $i;
            if ($point < 20) {
                $rlength = 1;
                $rpoint = - $point;
            } else {
                $rpoint = $length - 20;
                $rlength = 1;
            }

            echo "\t-> Section Data1  = ", substr_replace ( substr ( $data1, $start, $length ), "<b style=\"color:green\">{$data1 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
            echo "\t-> Section Data2  = ", substr_replace ( substr ( $data2, $start, $length ), "<b style=\"color:red\">{$data2 {$i}}</b>", $rpoint, $rlength ), PHP_EOL;
        }

    }

}

Cara yang lebih baik untuk menyimpan ke Database

$toDatabse = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting Save Format 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memasukkan objek datetime.datetime Python ke MySQL

  2. KESALAHAN:Memuat data lokal dinonaktifkan - ini harus diaktifkan di sisi klien dan server

  3. Ketersediaan Tinggi dengan Anggaran Sedikit - Menyebarkan Cluster Galera MySQL Dua Node Minimal

  4. ROW_NUMBER di SQL – Pilih Contoh Teratas di SQL dan SQL Server

  5. Cara Mengelola MySQL - untuk Oracle DBA