Saya menggunakan CMS Hotaru dengan plugin Unggah Gambar, saya mendapatkan kesalahan ini jika saya mencoba melampirkan gambar ke posting, jika tidak, tidak ada kesalahan:
unserialize () [function.unserialize]: Kesalahan pada offset
Kode yang melanggar (poin kesalahan yang sejalan dengan **):
/**
* Retrieve submission step data
*
* @param $key - empty when setting
* @return bool
*/
public function loadSubmitData($h, $key = '')
{
// delete everything in this table older than 30 minutes:
$this->deleteTempData($h->db);
if (!$key) { return false; }
$cleanKey = preg_replace('/[^a-z0-9]+/','',$key);
if (strcmp($key,$cleanKey) != 0) {
return false;
} else {
$sql = "SELECT tempdata_value FROM " . TABLE_TEMPDATA . " WHERE tempdata_key = %s ORDER BY tempdata_updatedts DESC LIMIT 1";
$submitted_data = $h->db->get_var($h->db->prepare($sql, $key));
**if ($submitted_data) { return unserialize($submitted_data); } else { return false; }**
}
}
Data dari tabel, perhatikan bit akhir memiliki info gambar, saya bukan ahli dalam PHP jadi saya bertanya-tanya apa yang mungkin kalian pikirkan?
tempdata_value:
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";}
Sunting: Saya pikir saya telah menemukan bit berseri ...
/**
* Save submission step data
*
* @return bool
*/
public function saveSubmitData($h)
{
// delete everything in this table older than 30 minutes:
$this->deleteTempData($h->db);
$sid = preg_replace('/[^a-z0-9]+/i', '', session_id());
$key = md5(microtime() . $sid . rand());
$sql = "INSERT INTO " . TABLE_TEMPDATA . " (tempdata_key, tempdata_value, tempdata_updateby) VALUES (%s,%s, %d)";
$h->db->query($h->db->prepare($sql, $key, serialize($h->vars['submitted_data']), $h->currentUser->id));
return $key;
}
php
mysql
serialization
content-management-system
pengguna576820
sumber
sumber
@unserialize($product->des_txtmopscol);
@
bukanlah pemecahan kesalahan, itu adalah pembungkaman kesalahan - tidak ada yang benar-benar "diperbaiki" dengan teknik itu.Jawaban:
unserialize() [function.unserialize]: Error at offset
adalah iuraninvalid serialization data
karena panjang yang tidak validPerbaikan Cepat
Apa yang dapat Anda lakukan adalah
recalculating the length
elemen dalam array serialAnda saat ini data serial
Contoh tanpa penghitungan ulang
Keluaran
Menghitung ulang
Keluaran
Rekomendasi .. I
Alih-alih menggunakan perbaikan cepat semacam ini ... saya akan menyarankan Anda memperbarui pertanyaan dengan
Bagaimana Anda membuat serial data Anda
Bagaimana Anda Menyimpannya ..
================================ EDIT 1 ================ ===============
Kesalahan
Kesalahan dihasilkan karena penggunaan tanda kutip ganda,
"
bukan tanda kutip tunggal,'
itulah sebabnyaC:\fakepath\100.png
diubah menjadiC:fakepath100.jpg
Untuk memperbaiki kesalahan tersebut
Anda perlu mengubah
$h->vars['submitted_data']
Dari (Perhatikan baik-baik saja'
)Menggantikan
Dengan
Filter Tambahan
Anda juga dapat menambahkan filter sederhana ini sebelum memanggil serialize
Jika Anda memiliki Karakter UTF, Anda juga dapat menjalankan
Cara mendeteksi masalah dalam data serial di masa mendatang
Keluaran
findSerializeError
FungsiCara yang lebih baik untuk menyimpan ke Database
sumber
findSerializeError
fungsi luar biasa Anda dan menemukan banyak kesalahan. Silakan lihat topik sayabase64
pada Artikel sebelum menambahkannya ke database ... itu akan mempertahankan karakter nullSaya tidak punya cukup reputasi untuk berkomentar, jadi saya harap ini dilihat oleh orang-orang yang menggunakan jawaban "benar" di atas:
Sejak php 5.5 pengubah / e di preg_replace () telah ditinggalkan sepenuhnya dan preg_match di atas akan error. Dokumentasi php merekomendasikan penggunaan preg_match_callback sebagai gantinya.
Temukan solusi berikut sebagai alternatif dari preg_match yang diusulkan di atas.
sumber
strlen()
dan oleh karena itu membuat panggilan fungsi yang berlebihan. Secara pribadi, saya menemukan penambahan kondisi sebaris terlalu bertele-tele, tetapi cuplikan ini melakukan hal-hal baik untuk alasan yang baik.'!s:(\d+):"(.*?)";!s'
(dengan akhiran 'untuk mengambil baris baru juga). Berkat komentar adilbo di bawah ini.Ada alasan lain
unserialize()
gagal karena Anda memasukkan data serial ke dalam database dengan tidak benar, lihat Penjelasan Resmi di sini. Karenaserialize()
mengembalikan data biner dan variabel php tidak peduli dengan metode pengkodean, sehingga memasukkannya ke dalam TEXT, VARCHAR () akan menyebabkan kesalahan ini.Solusi: simpan data serial ke dalam BLOB di tabel Anda.
sumber
image
nilainya. Jawaban Anda tidak berkaitan dengan pertanyaan spesifik OP. Anda mungkin ingin menyampaikan saran Anda ke: stackoverflow.com/q/5544749/2943403Perbaikan Cepat
Menghitung ulang panjang elemen dalam array serial - tetapi jangan gunakan (preg_replace) sudah usang - lebih baik gunakan preg_replace_callback:
Sunting: Versi Baru sekarang tidak hanya panjang yang salah tetapi juga memperbaiki jeda baris dan menghitung karakter yang benar dengan aczent (terima kasih kepada mickmackusa )
sumber
Kesalahan ini disebabkan karena rangkaian karakter Anda salah.
Setel charset setelah tag terbuka:
Dan setel charset utf8 di database Anda:
sumber
image
nilainya secara manual dan gagal memperbarui jumlah byte. Kecuali diinformasikan sebaliknya, saya harus berasumsi bahwa jawaban ini salah untuk pertanyaan OP.Anda dapat memperbaiki string serialisasi yang rusak menggunakan fungsi berikut, dengan penanganan karakter multibyte .
sumber
mb_strlen()
itu tidak pantas karenaserialize()
menyimpan jumlah byte, bukan jumlah karakter. Mengedit jawaban Anda menjadi benar hanya akan membuat saran yang berlebihan di halaman.public function unserializeKeySkills ($ string) {
sumber
trim()
setiap substring yang cocok. Poin itu saja membuat solusi ini tidak mungkin untuk direkomendasikan. Selanjutnya, ini akan mencekik karakter baris baru dan tidak perlu menangkap jumlah byte yang sudah ada sebelumnya yang hanya akan ditimpa bagaimanapun juga. Terakhir, ini adalah "jawaban hanya kode" dan jenis jawaban ini bernilai rendah karena tidak banyak membantu mendidik / memberdayakan peneliti di masa depan.Anda tidak dapat memperbaiki string serialisasi yang rusak menggunakan regex yang diusulkan:
Anda dapat memperbaiki string serialisasi yang rusak menggunakan regex berikut:
Keluaran
atau
sumber
yang docs resmi mengatakan harus kembali E_NOTICE palsu dan set
tetapi karena Anda mendapatkan kesalahan maka pelaporan kesalahan diatur untuk dipicu oleh E_NOTICE
berikut adalah perbaikan untuk memungkinkan Anda mendeteksi false dikembalikan oleh
unserialize
Anda mungkin ingin mempertimbangkan untuk menggunakan encode / decode base64
sumber
base64_encode
melakukan trik untuk saya. Saya kasus saya, kami mengirimkanserialize
data d melalui baris perintah dan sepertinya beberapa karakter aneh mencegahnya berfungsi dengan benar.base64_encode()
bukanlah solusi untuk pertanyaan yang diajukan oleh OP. Pertanyaan / masalah OP secara khusus berhubungan dengan fakta bahwa (kemungkinan besar dilakukan untuk penggantian substring yang tidak tepat pada "elemen array terakhir" dari string serial) ada jumlah byte yang salah dalam string serial. Harap hanya posting jawaban yang berhubungan langsung dengan pertanyaan yang diajukan.Kerusakan dalam pertanyaan ini diisolasi ke satu substring di akhir string serial dengan mungkin secara manual diganti oleh seseorang yang malas ingin memperbarui
image
nama file. Fakta ini akan terlihat dalam tautan demonstrasi saya di bawah ini menggunakan data yang diposting OP - singkatnya,C:fakepath100.jpg
tidak memiliki panjang19
, seharusnya17
.Karena kerusakan string serial terbatas pada jumlah byte / karakter yang salah, berikut ini akan melakukan pekerjaan yang baik untuk memperbarui string yang rusak dengan nilai jumlah byte yang benar.
Penggantian berbasis regex berikut hanya akan efektif dalam memperbaiki jumlah byte, tidak lebih.
Sepertinya banyak dari postingan sebelumnya hanya menyalin-tempel pola regex dari orang lain. Tidak ada alasan untuk menangkap nomor hitungan byte yang berpotensi rusak jika tidak akan digunakan dalam penggantinya. Juga, menambahkan
s
pengubah pola adalah penyertaan yang wajar jika nilai string berisi baris baru / baris kembali.* Bagi mereka yang tidak mengetahui perlakuan karakter multibyte dengan serialisasi, Anda tidak boleh menggunakan
mb_strlen()
dalam panggilan balik kustom karena jumlah byte yang disimpan bukan jumlah karakter , lihat keluaran saya ...Kode: ( Demo dengan data OP ) ( Demo dengan sampel data sewenang-wenang ) ( Demo dengan kondisi penggantian )
Keluaran:
Satu kaki ke lubang kelinci ... Cara di atas berfungsi dengan baik bahkan jika tanda kutip ganda terjadi dalam nilai string, tetapi jika nilai string berisi
";
atau beberapa sbustring monkeywrenching lainnya, Anda harus melangkah lebih jauh dan menerapkan "lookarounds". Pola baru sayamemeriksa bahwa terdepan
s
adalah:;
dan periksa
";
apakah:}
ataus:
ataui:
Saya belum menguji setiap kemungkinan; sebenarnya, saya relatif tidak terbiasa dengan semua kemungkinan dalam string berseri karena saya tidak pernah memilih untuk bekerja dengan data berseri - selalu json dalam aplikasi modern. Jika ada karakter tambahan di depan atau di belakang yang mungkin, tinggalkan komentar dan saya akan memperluas tampilan.
Cuplikan diperpanjang: ( Demo )
Keluaran:
sumber
Anda harus mengubah jenis pemeriksaan menjadi
utf8_unicode_ci
dan masalah akan diperbaiki.sumber
utf8_unicode_ci
? Saya ragu untuk yang satu ini.Dalam kasus saya, saya menyimpan data serial di
BLOB
bidang MySQL DB yang tampaknya tidak cukup besar untuk memuat seluruh nilai dan memotongnya. String seperti itu jelas tidak bisa dibatalkan serialnya.Setelah diubah bidang itu menjadi
MEDIUMBLOB
masalah yang hilang. Mungkin juga diperlukan untuk mengganti opsi tabelROW_FORMAT
keDYNAMIC
atauCOMPRESSED
.sumber
TEXT
ladang dan dengan demikian terpotong pada 65kb.Setelah mencoba beberapa hal di halaman ini tanpa hasil, saya melihat-lihat halaman-sumber dan menyatakan bahwa semua kutipan dalam string berseri telah diganti dengan html-entity. Decoding entitas ini membantu menghindari banyak sakit kepala:
sumber
Berikut adalah Alat Online untuk memperbaiki string serial yang rusak.
Saya ingin menambahkan bahwa ini sebagian besar terjadi karena pencarian dan penggantian dilakukan pada DB dan data serialisasi ( khususnya file
key length
) tidak diperbarui sesuai dengan mengganti dan yang menyebabkan "korupsi".Meskipun demikian, alat di atas menggunakan logika berikut untuk memperbaiki data serialisasi ( Disalin Dari Sini ).
sumber
Alasan lain dari masalah ini adalah jenis kolom tabel sesi "payload". Jika Anda memiliki data besar pada sesi, kolom teks tidak akan cukup. Anda akan membutuhkan MEDIUMTEXT atau bahkan LONGTEXT.
sumber