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
aufrufenfunction 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