Ich verwende Hotaru CMS mit dem Image Upload-Plugin. Ich erhalte diese Fehlermeldung, wenn ich versuche, ein Bild an einen Beitrag anzuhängen. Andernfalls tritt kein Fehler auf:
unserialize () [function.unserialize]: Fehler beim Offset
Der fehlerhafte Code (Fehler zeigt auf **):
/**
* 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; }**
}
}
Daten aus der Tabelle, beachten Sie, dass das Endbit die Bildinformationen enthält. Ich bin kein Experte für PHP, also habe ich mich gefragt, was Sie Jungs / Mädels denken könnten.
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";}
Edit: Ich glaube ich habe das Serialize Bit gefunden ...
/**
* 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
user576820
quelle
quelle
@unserialize($product->des_txtmopscol);
@
ist keine Fehlerbehebung, sondern eine Fehlerunterdrückung - mit dieser Technik wird nichts "behoben".Antworten:
unserialize() [function.unserialize]: Error at offset
war Gebühren aninvalid serialization data
wegen ungültiger Länge fälligSchnelle Lösung
Was Sie tun können, sind
recalculating the length
die Elemente in einem serialisierten ArraySie aktuell serialisierte Daten
Beispiel ohne Neuberechnung
Ausgabe
Neuberechnung
Ausgabe
Empfehlung .. I.
Anstatt diese Art der schnellen Lösung zu verwenden, rate ich Ihnen, die Frage mit zu aktualisieren
Wie Sie Ihre Daten serialisieren
Wie Sie es speichern ..
=============================== EDIT 1 ================ ===============
Der Fehler
Der Fehler wurde aufgrund der Verwendung eines doppelten Anführungszeichens
"
anstelle eines einfachen Anführungszeichens generiert'
, weshalbC:\fakepath\100.png
in konvertiert wurdeC:fakepath100.jpg
Um den Fehler zu beheben
Sie müssen von ändern
$h->vars['submitted_data']
(Beachten Sie den Stich ganz'
)Ersetzen
Mit
Zusätzlicher Filter
Sie können diesen einfachen Filter auch hinzufügen, bevor Sie serialize aufrufen
Wenn Sie UTF-Zeichen haben, können Sie diese auch ausführen
So erkennen Sie das Problem in zukünftigen serialisierten Daten
Ausgabe
findSerializeError
FunktionEin besserer Weg, um in der Datenbank zu speichern
quelle
findSerializeError
Funktion benutzt und viele Fehler gefunden. Bitte werfen Sie einen Blick auf mein Themabase64
auf Artikel, bevor Sie es zur Datenbank hinzufügen ... es würde das Nullzeichen beibehaltenIch habe nicht genug Ruf, um Kommentare abzugeben, daher hoffe ich, dass dies von Leuten gesehen wird, die die obige "richtige" Antwort verwenden:
Seit PHP 5.5 ist der Modifikator / e in preg_replace () vollständig veraltet und der obige preg_match wird fehlerhaft. In der PHP-Dokumentation wird empfohlen, stattdessen preg_match_callback zu verwenden.
Als Alternative zum oben vorgeschlagenen preg_match finden Sie die folgende Lösung.
quelle
strlen()
und führt daher redundante Funktionsaufrufe durch. Persönlich finde ich das Hinzufügen einer Inline-Bedingung zu ausführlich, aber dieses Snippet macht aus guten Gründen gute Dinge.'!s:(\d+):"(.*?)";!s'
(mit einem Ende 's', um auch neue Zeilen aufzunehmen). Vielen Dank an Adilbos Kommentar unten.Es gibt einen weiteren Grund, der
unserialize()
fehlgeschlagen ist, weil Sie serialisierte Daten nicht ordnungsgemäß in die Datenbank gestellt haben (siehe Offizielle Erklärung hier). Schon seitserialize()
Rückgabedaten und PHP-Variablen keine Codierungsmethoden interessieren, verursacht VARCHAR () diesen Fehler, wenn sie in TEXT eingefügt werden.Lösung: Speichern Sie serialisierte Daten in BLOB in Ihrer Tabelle.
quelle
image
Wertes beschädigt . Ihre Antwort bezieht sich nicht auf die spezifische Frage des OP. Sie können Ihren Rat an folgende AdresseSchnelle Lösung
Berechnen Sie die Länge der Elemente in einem serialisierten Array neu - verwenden Sie jedoch nicht (preg_replace), es ist veraltet - verwenden Sie besser preg_replace_callback:
Edit: Neue Version jetzt nicht nur falsche Länge, sondern auch Zeilenumbrüche korrigiert und korrekte Zeichen mit aczent gezählt (dank mickmackusa )
quelle
Dieser Fehler wird verursacht, weil Ihr Zeichensatz falsch ist.
Zeichensatz nach offenem Tag setzen:
Und setzen Sie charset utf8 in Ihrer Datenbank:
quelle
image
Wert manuell aktualisiert und die Anzahl der Bytes nicht aktualisiert. Sofern nicht anders angegeben, muss ich davon ausgehen, dass diese Antwort für die Frage des OP falsch ist.Sie können fehlerhafte Serialisierungszeichenfolgen mithilfe der folgenden Funktion mit Multibyte-Zeichenbehandlung beheben .
quelle
mb_strlen()
unangemessen ist, daserialize()
die Anzahl der Bytes und nicht die Anzahl der Zeichen gespeichert wird . Wenn Sie Ihre Antwort so bearbeiten, dass sie korrekt ist, werden nur redundante Hinweise auf der Seite erstellt.öffentliche Funktion unserializeKeySkills ($ string) {
quelle
trim()
jede übereinstimmende Teilzeichenfolge zu konvertieren . Dieser Punkt allein macht es unmöglich, diese Lösung zu empfehlen. Darüber hinaus wird es an Zeilenumbrüchen ersticken und unnötigerweise die bereits vorhandene Byteanzahl erfassen, die ohnehin nur überschrieben wird. Schließlich ist dies eine "Nur-Code-Antwort", und diese Arten von Antworten sind von geringem Wert, da sie wenig dazu beitragen, zukünftige Forscher auszubilden / zu befähigen.Sie können eine fehlerhafte Serialisierungszeichenfolge mit den vorgeschlagenen regulären Ausdrücken nicht beheben:
Sie können eine fehlerhafte Serialisierungszeichenfolge mithilfe des folgenden regulären Ausdrucks beheben:
Ausgabe
oder
quelle
die offiziellen Dokumente sagen, dass es false zurückgeben und E_NOTICE setzen sollte
Da Sie jedoch einen Fehler erhalten haben, wird die Fehlerberichterstattung so eingestellt, dass sie von E_NOTICE ausgelöst wird
Hier ist ein Fix, mit dem Sie falsche Rückmeldungen von erkennen können
unserialize
Möglicherweise möchten Sie die Verwendung von base64 encode / decode in Betracht ziehen
quelle
base64_encode
hat den Trick für mich gemacht. In meinem Fall übergeben wirserialize
d Daten über die Befehlszeile und es sah so aus, als würden einige seltsame Zeichen verhindern, dass sie richtig funktionieren.base64_encode()
ist nicht die Lösung für die vom OP gestellte Frage. Die Frage / das Problem des OP befasst sich speziell mit der Tatsache, dass (wahrscheinlich aufgrund eines unangemessenen Ersetzens von Teilzeichenfolgen für das "letzte Array-Element" der serialisierten Zeichenfolge) eine falsche Byteanzahl in der serialisierten Zeichenfolge vorhanden ist. Bitte posten Sie nur Antworten, die sich direkt mit der gestellten Frage befassen.Die Beschädigung in dieser Frage ist auf eine einzelne Teilzeichenfolge am Ende der serialisierten Zeichenfolge beschränkt, die wahrscheinlich manuell durch jemanden ersetzt wurde, der den
image
Dateinamen träge aktualisieren wollte . Diese Tatsache wird in meinem Demonstrationslink unten unter Verwendung der vom OP veröffentlichten Daten deutlich - kurz gesagt,C:fakepath100.jpg
hat keine Länge von19
, sollte es sein17
.Da die Beschädigung der serialisierten Zeichenfolge auf eine falsche Anzahl von Bytes / Zeichen beschränkt ist, können Sie die beschädigte Zeichenfolge im Folgenden mit dem richtigen Wert für die Anzahl der Bytes aktualisieren.
Der folgende regexbasierte Ersatz ersetzt nur die Anzahl der Bytes, nicht mehr.
Es sieht so aus, als würden viele der früheren Beiträge nur ein Regex-Muster von jemand anderem kopieren und einfügen. Es gibt keinen Grund, die möglicherweise beschädigte Byteanzahl zu erfassen, wenn sie beim Ersetzen nicht verwendet wird. Auch das Hinzufügen der
s
Mustermodifikators ist auch eine sinnvolle Einbeziehung, wenn ein Zeichenfolgenwert Zeilenumbrüche enthält.* Für diejenigen, die sich der Behandlung von Multibyte-Zeichen mit Serialisierung nicht bewusst sind, dürfen Sie sie nicht
mb_strlen()
im benutzerdefinierten Rückruf verwenden, da die Anzahl der Bytes und nicht die Anzahl der Zeichen gespeichert wird ist. Siehe meine Ausgabe ...Code: ( Demo mit OP-Daten ) ( Demo mit beliebigen Beispieldaten ) ( Demo mit Ersetzen der Bedingung )
Ausgabe:
Ein Bein das Kaninchenloch hinunter ... Das Obige funktioniert auch dann einwandfrei, wenn in einem Zeichenfolgenwert doppelte Anführungszeichen stehen, ein Zeichenfolgenwert jedoch enthält
";
einwandfrei, andere Affenschlüssel enthält, müssen Sie ein wenig weiter gehen und "Lookarounds" implementieren. Mein neues Musterprüft, ob der führende
s
ist:;
und prüft, ob die
";
ist:}
oders:
oderi:
Ich habe nicht jede Möglichkeit getestet. Tatsächlich bin ich mit allen Möglichkeiten einer serialisierten Zeichenfolge relativ unbekannt, da ich mich nie dafür entscheide, mit serialisierten Daten zu arbeiten - in modernen Anwendungen immer json. Wenn es zusätzliche mögliche führende oder nachfolgende Zeichen gibt, hinterlasse einen Kommentar und ich werde die Lookarounds erweitern.
Erweitertes Snippet: ( Demo )
Ausgabe:
quelle
Sie müssen den Sortierungstyp in ändern
utf8_unicode_ci
und das Problem wird behoben.quelle
utf8_unicode_ci
? Ich habe meine Zweifel an diesem.In meinem Fall habe ich serialisierte Daten im
BLOB
Feld von MySQL DB gespeichert, das anscheinend nicht groß genug war, um den gesamten Wert zu enthalten, und ihn abgeschnitten. Eine solche Zeichenfolge konnte offensichtlich nicht unserialisiert werden.Einmal konvertiert dieses Feld in
MEDIUMBLOB
das Problem aufgelöst. Es kann auch erforderlich sein, TabellenoptionenROW_FORMAT
aufDYNAMIC
oder umzuschaltenCOMPRESSED
.quelle
TEXT
Feld war und als solches bei 65kb abgeschnitten.Nachdem ich einige Dinge auf dieser Seite erfolglos ausprobiert hatte, schaute ich in die Seitenquelle und bemerkte, dass alle Anführungszeichen in der serialisierten Zeichenfolge durch HTML-Entitäten ersetzt wurden. Das Dekodieren dieser Entitäten hilft, viel Kopfschmerz zu vermeiden:
quelle
Hier ist ein Online-Tool zum Beheben einer beschädigten serialisierten Zeichenfolge.
Ich möchte hinzufügen, dass dies hauptsächlich aufgrund einer Suche und Ersetzung der Datenbank und der Serialisierungsdaten ( insbesondere der) geschieht
key length
) nicht gemäß der Ersetzung aktualisiert werden und dies die "Beschädigung" verursacht.Das obige Tool verwendet jedoch die folgende Logik, um die Serialisierungsdaten zu korrigieren ( von hier kopiert ).
quelle
Ein weiterer Grund für dieses Problem kann der Spaltentyp der Sitzungstabelle "Payload" sein. Wenn Sie große Datenmengen in der Sitzung haben, würde eine Textspalte nicht ausreichen. Sie benötigen MEDIUMTEXT oder sogar LONGTEXT.
quelle