Проверьте, чтобы видеть, сериализируется ли строка?

У меня была та же проблема, и метод пользователя user76204 работал на меня, но вместо того, чтобы просто удалить /usr/lib/gio/modules libglib2.0-0 из файла /var/lib/dpkg/triggers/File я должен был удалить все 3:

/usr/lib/x86_64-linux-gnu/gio/modules libglib2.0-0                                         
/usr/lib/gio/modules libglib2.0-0                                                          
/usr/share/glib-2.0/schemas libglib2.0-0           

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

129
задан David 15 August 2011 в 14:09
поделиться

3 ответа

Я бы сказал, попробуйте десериализовать это; -)

Цитата из руководства:

В случае, если переданная строка не unserializeable, возвращается FALSE и Выдается E_NOTICE.

Итак, вы должны проверить, является ли возвращаемое значение ложным или нет === или ! == ], чтобы убедиться, что у вас нет проблем с 0 или null или чем-либо, что равно false , я бы сказал) .

Просто обратите внимание: вам может понадобиться / понадобится использовать @ operator .

Например:

$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

Вы получите:

not ok


РЕДАКТИРОВАТЬ: О, и как сказал @Peter (спасибо ему!), вы можете столкнуться с проблемами, если попытаетесь десериализовать представление логического false: - (

Итак, проверка того, что ваша сериализованная строка не равна " b: 0; "тоже может быть полезно; я полагаю, что-то вроде этого должно помочь:

$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

Тестирование этого особого случая перед попыткой десериализации было бы оптимизацией - но, вероятно, не очень полезно, если у вас не часто бывает ложное сериализованное значение.

183
ответ дан 24 November 2019 в 00:29
поделиться

Несмотря на превосходный ответ Паскаля МАРТИНА, мне было любопытно, можете ли вы подойти к этому по-другому, поэтому я сделал это просто как мысленное упражнение

<?php

ini_set( 'display_errors', 1 );
ini_set( 'track_errors', 1 );
error_reporting( E_ALL );

$valueToUnserialize = serialize( false );
//$valueToUnserialize = "a"; # uncomment this for another test

$unserialized = @unserialize( $valueToUnserialize );

if ( FALSE === $unserialized && isset( $php_errormsg ) && strpos( $php_errormsg, 'unserialize' ) !== FALSE )
{
  echo 'Value could not be unserialized<br>';
  echo $valueToUnserialize;
} else {
  echo 'Value was unserialized!<br>';
  var_dump( $unserialized );
}

И это действительно работает. Единственное предостережение: если у вас зарегистрированный обработчик ошибок, он, скорее всего, сломается из-за того, как работает $ php_errormsg .

13
ответ дан 24 November 2019 в 00:29
поделиться
$data = @unserialize($str);
if($data !== false || $str === 'b:0;')
    echo 'ok';
else
    echo "not ok";

Правильно обрабатывает случай сериализовать (ложь) . :)

11
ответ дан 24 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: