Heim > Backend-Entwicklung > PHP-Tutorial > Wie behebt man „unserialize(): Error at offset' in PHP-serialisierten Strings?

Wie behebt man „unserialize(): Error at offset' in PHP-serialisierten Strings?

DDD
Freigeben: 2024-12-08 12:51:11
Original
399 Leute haben es durchsucht

How to Fix

So reparieren Sie eine beschädigte serialisierte Zeichenfolge mit ungültiger Byteanzahllänge

Einführung

Beim Umgang mit serialisierten Daten kann ein Fehler auftreten „unserialize() [function.unserialize]: Fehler beim Offset.“ Dieser Fehler tritt normalerweise aufgrund ungültiger Serialisierungsdaten auf, die durch eine falsche Byte-Zähllänge verursacht werden.

Warum der Fehler auftritt

Während der Serialisierung berechnet PHP die Länge jedes Elements im serialisierten Array mithilfe von strlen( ) Funktion. Wenn die Daten jedoch Zeichen wie doppelte Anführungszeichen enthalten, die eine besondere Behandlung (z. B. Escapezeichen) erfordern, kann die Byteanzahl falsch werden.

Schnellkorrektur

Um diesen Fehler zu beheben, ist dies der Fall Es ist erforderlich, die Länge jedes Elements im serialisierten Array manuell neu zu berechnen:

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

Empfohlen Vorgehensweise

Neben der schnellen Lösung ist es wichtig, die Ursache für die fehlerhafte Serialisierung zu ermitteln. Beachten Sie die folgenden Schritte:

  • Stellen Sie sicher, dass doppelte Anführungszeichen (") ordnungsgemäß maskiert werden, z. B. einfache Anführungszeichen (').
  • Wenn die Daten UTF-8-Zeichen enthalten, verwenden Sie array_map("utf8_encode", $data), um sie vor der Serialisierung zu kodieren.
  • Verwenden Sie die Base64-Kodierung, um die serialisierten Daten zu konvertieren in ein sicheres Format konvertieren, bevor Sie es in der Datenbank speichern:
$toDatabase = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting saved format
Nach dem Login kopieren

Erkennen von Fehlern in serialisierten Daten

Obwohl die Fehlermeldung einen allgemeinen Hinweis auf das Problem gibt, ist sie oft hilfreich Bestimmen Sie dazu den genauen Speicherort der beschädigten Daten, indem Sie die Funktion findSerializeError verwenden, die zwei serialisierte Zeichenfolgen vergleicht und die Unterschiede zwischen ihnen, einschließlich falscher Bytes, identifiziert zählt:

function findSerializeError($data1) {
    echo "<pre class="brush:php;toolbar:false">";
    $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1);
    // ...
}
Nach dem Login kopieren

Durch die Bereitstellung detaillierter Informationen zum Fehler hilft diese Funktion, Serialisierungsprobleme zu identifizieren und zu beheben.

Das obige ist der detaillierte Inhalt vonWie behebt man „unserialize(): Error at offset' in PHP-serialisierten Strings?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage