当参数只是一个简单的字符串时,PHP反序列化偏移量错误

时间:2014-10-03 16:33:21

标签: php serialization

我在申请SO Ans后提出问题。

我正在尝试从从DB获取的序列化字符串中反序列化。

我收到错误:反序列化偏移错误

我有两个案例

两种情况下的相同代码:

 $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: 无错误代码ID工作正常

2 个答案:

答案 0 :(得分:1)

反序列化仅适用于序列化字符串。在尝试反序列化不是序列化数组的字符串时,您需要阻止打印通知。

$cat_unserialize = @unserialize($categories);

否则,我不确定为什么会出问题 然后,在使用变量之前,您可以检查它是否是数组或字符串。

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

另外,我不了解preg_replace()。为什么要删除使字符串序列化的元素,然后尝试反序列化呢?

答案 1 :(得分:0)

如果你想要长选项:这是来自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;
}

Check to see if a string is serialized?