сериализация — PHP ошибка несериализации смещения, когда аргумент представляет собой простую строку

Я задаю вопрос после того, как применил ТАК.

я пытаюсь десериализовать из сериализованной строки, извлеченной из БД.

Я получаю сообщение об ошибке: ошибка несериализации смещения

У меня два дела

Один и тот же код в обоих случаях:

 $categories = preg_replace( '!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'",  $data['Member']['category'] );
var_dump($categories);
$cat_unserialize = unserialize($categories);
var_dump($cat_unserialize );

случай 1: когда

$data['Member']['category'] => Adventure Camps

случай 1: ошибка:

string 'Adventure Camps' (length=15)

Notice (8): unserialize(): Error at offset 0 of 15 bytes

boolean false

случай 2: когда

$data['Member']['category'] => a:4:{i:0;s:9:"Adventure";i:1;s:12:"Sports ";i:2;s:15:"Training";i:3;s:29:"Educational";}

случай 2: Нет кода ошибки, идентификатор работает нормально

0

Решение

Unserialize работает только на сериализованной строке. Необходимо предотвратить печать уведомления при попытке десериализации строки, не являющейся сериализованным массивом.

$cat_unserialize = @unserialize($categories);

В противном случае, я не уверен, почему это будет проблемой.
Затем, прежде чем использовать переменную, вы можете проверить, является ли она массивом или строкой.

if(is_array($cat_unserialize)) {
//do something with array.
}
else {
//do something with string.
}

Также я не понимаю preg_replace (). Зачем удалять элементы, которые делают сериализованную строку, а затем пытаться десериализовать ее?

1

Другие решения

Если вы хотите длинный вариант: это из WordPress

<?php
function is_serialized( $data ) {
// if it isn't a string, it isn't serialized
if ( !is_string( $data ) )
return false;
$data = trim( $data );
if ( 'N;' == $data )
return true;
if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
return false;
switch ( $badions[1] ) {
case 'a' :
case 'O' :
case 's' :
if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) )
return true;
break;
case 'b' :
case 'i' :
case 'd' :
if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) )
return true;
break;
}
return false;
}

Проверить, сериализована ли строка?

0

По вопросам рекламы [email protected]