Heim >Datenbank >MySQL-Tutorial >Wie behebt man „unserialize(): Fehler am Offset', der durch eine falsche Byte-Anzahllänge in serialisierten PHP-Strings verursacht wird?

Wie behebt man „unserialize(): Fehler am Offset', der durch eine falsche Byte-Anzahllänge in serialisierten PHP-Strings verursacht wird?

Barbara Streisand
Barbara StreisandOriginal
2024-12-22 19:10:14961Durchsuche

How to Fix

So beheben Sie eine beschädigte serialisierte Zeichenfolge aufgrund einer falschen Byteanzahllänge

Der Fehler „unserialize() [function.unserialize ]: Fehler am Offset“ tritt häufig auf, wenn mit beschädigten serialisierten Zeichenfolgen gearbeitet wird. In diesem Fall ist das Problem auf eine falsche Länge der Byteanzahl zurückzuführen.

Verstehen des Problems

Wenn PHP Daten serialisiert, speichert es die Länge jedes serialisierten Elements als Präfix. Wenn diese Länge ungenau ist, kann PHP die Zeichenfolge nicht korrekt deserialisieren.

Schnelllösung

Um dieses Problem zu beheben, berechnen Sie die Länge jedes Elements im serialisierten Array mit neu die folgende Code:

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

Beispiel:

$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

Empfehlungen:

Anstatt sich auf schnelle Lösungen zu verlassen, ist es so Es ist wichtig, Ihren Code auf Folgendes zu aktualisieren:

  • Verwenden Sie einfache Anführungszeichen für Zeichenfolgenwerte anstelle von doppelten Anführungszeichen, um Konflikte mit Pfadtrennzeichen zu vermeiden.
  • Erwägen Sie die Verwendung der Base64-Kodierung, bevor Sie serialisierte Daten in der Datenbank speichern und vor der Deserialisierung dekodieren.
  • Fügen Sie eine Funktion zur Validierung der Integrität von ein serialisierte Zeichenfolgen vor der Deserialisierung (im Beispiel unten bereitgestellt).

Validierung Funktion:

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;
}

Das obige ist der detaillierte Inhalt vonWie behebt man „unserialize(): Fehler am Offset', der durch eine falsche Byte-Anzahllänge in serialisierten PHP-Strings verursacht wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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