Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie repariert man eine serialisierte Zeichenfolge, die durch eine falsche Byte-Zähllänge beschädigt wurde?

unserialize() [function.unserialize]: Error at offset war auf invalid serialization data zurückzuführen wegen ungültiger Länge

Schnelle Lösung

Was Sie tun können, ist recalculating the length der Elemente im serialisierten Array

Ihre aktuellen serialisierten Daten

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

Beispiel ohne Neuberechnung

var_dump(unserialize($data));

Ausgabe

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

Neuberechnung

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

Ausgabe

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)

Empfehlung .. ich

Anstatt diese Art von Schnellkorrektur zu verwenden ... empfehle ich Ihnen, die Frage mit

zu aktualisieren
  • Wie Sie Ihre Daten serialisieren

  • Wie Sie es speichern ..

===============================BEARBEITEN 1 ===============================

Der Fehler

Der Fehler wurde aufgrund der Verwendung von doppelten Anführungszeichen " generiert stattdessen einfaches Anführungszeichen ' deshalb C:\fakepath\100.png wurde in C:fakepath100.jpg umgewandelt

Um den Fehler zu beheben

Sie müssen $h->vars['submitted_data'] ändern Von (Beachten Sie die Singe ganz ' )

Ersetzen

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

Mit

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

Zusätzlicher Filter

Sie können diesen einfachen Filter auch hinzufügen, bevor Sie serialize

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

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

Wenn Sie UTF-Zeichen haben, können Sie auch

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

Erkennen des Problems in zukünftigen serialisierten Daten

  findSerializeError ( $data1 ) ;

Ausgabe

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 Funktion

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

    }

}

Eine bessere Methode zum Speichern in der Datenbank

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