Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да поправя сериализиран низ, който е повреден от неправилна дължина на броя на байтовете?

unserialize() [function.unserialize]: Error at offset се дължи на invalid serialization data поради невалидна дължина

Бързо решение

Това, което можете да направите, е да recalculating the length на елементите в сериализиран масив

Вашите текущи сериализирани данни

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

Пример без преизчисление

var_dump(unserialize($data));

Изход

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

Преизчисляване

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

Изход

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)

Препоръка .. аз

Вместо да използвате този вид бърза корекция... ще ви посъветвам да актуализирате въпроса с

  • Как сериализирате данните си

  • Как го запазвате ..

================================РЕДАКТИРАНЕ 1 =================================

Грешката

Грешката е генерирана поради използване на двойни кавички " вместо единични кавички ' ето защо C:\fakepath\100.png беше преобразуван в C:fakepath100.jpg

За да коригирате грешката

Трябва да промените $h->vars['submitted_data'] От (Обърнете внимание на пеенето доста ' )

Заменете

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

С

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

Допълнителен филтър

Можете също да добавите този прост филтър, преди да извикате serialize

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

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

Ако имате UTF символи, можете също да стартирате

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

Как да открием проблема в бъдещи сериализирани данни

  findSerializeError ( $data1 ) ;

Изход

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 Функция

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

    }

}

По-добър начин за запазване в база данни

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Затваряне на JDBC връзки в пула

  2. Значението на дължината на varchar в таблицата на MySQL

  3. Сортиране в MySQL с помощта на подреждане по клауза

  4. Работа за заобикаляне на грешка в MySQL Открита застой при опит за заключване; опитайте да рестартирате транзакцията

  5. Имам нужда от моята PHP страница, за да покажа моето BLOB изображение от mysql база данни