unserialize()出错

时间:2018-01-22 11:45:05

标签: php serialization

我试图修复unserialize()上的PHP错误。我知道我们可以使用@来抑制它,但是可以在不压制的情况下修复该错误。

这是表&我的代码:

TABLE: 'config'

id   c_key                  c_value
1    facebook               a:1:{i:0;s:8:"Newsfeed";}
2    mg_notification_msv    to.aaaa.org

public function db_get_config($key, $default = null)
{
    if (!empty($key)) {
        // $record = $this->db_get_record($this->tables['config'], array('c_key' => $key));
        $record = $this->db->from($this->tables['config'])->where(array('c_key' => $key))->limit(1)->get()->row_array();
        if (!empty($record)) {
            $value = unserialize($record['c_value']); // Message: unserialize(): Error at offset 0 of 15 bytes
            if ($value === false) {
                $value = $record['c_value'];
            }
            return $value;
        }
    }

    return $default;
}

$key作为facebookmg_notification_msv传递时,该函数会在array(1) { [0]=> string(8) "Newsfeed" }上返回string(15) "to.aaaa.org"var_dump()

这将返回错误:

  

遇到PHP错误   严重性:通知消息:unserialize():偏移量为0的15字节错误   文件名:models / common_model.php   行号:xxxx

有没有办法解决这个PHP错误?

strlen()上使用$record['c_value']对我没有帮助。

2 个答案:

答案 0 :(得分:0)

它可能会抛出该错误,因为当您尝试反序列化mg_notification_msv的值时,它尝试反序列化之前未序列化的字符串(to.aaaa.org不是序列化的字符串)

只有在字符串不可序列化时,您才可以尝试反序列化:

if (@unserialize($record['c_value']) !== false ) {
    $value = unserialize($record['c_value']);
} else {
    $value = $record['c_value'];
}

答案 1 :(得分:0)

我试过WP is_serialized()&可能解决了我的问题。

<?php
public function db_get_config($key, $default = null)
{
    if (!empty($key)) {
        // $record = $this->db_get_record($this->tables['config'], array('c_key' => $key));
        $record = $this->db->from($this->tables['config'])->where(array('c_key' => $key))->limit(1)->get()->row_array();
        if (!empty($record)) {
            $e = $this->is_serialized($record['c_value']); // WP support function
            if ($e === true) {
                $value = unserialize($record['c_value']);
                if ($value === false) {
                    $value = $record['c_value'];
                }
            } else {
                $value = $record['c_value'];
            }
            return $value;
        }
    }

    return $default;
}

private function is_serialized( $data, $strict = true )
{
    // 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 ( strlen( $data ) < 4 ) {
        return false;
    }
    if ( ':' !== $data[1] ) {
        return false;
    }
    if ( $strict ) {
        $lastc = substr( $data, -1 );
        if ( ';' !== $lastc && '}' !== $lastc ) {
            return false;
        }
    } else {
        $semicolon = strpos( $data, ';' );
        $brace     = strpos( $data, '}' );
        // Either ; or } must exist.
        if ( false === $semicolon && false === $brace )
            return false;
        // But neither must be in the first X characters.
        if ( false !== $semicolon && $semicolon < 3 )
            return false;
        if ( false !== $brace && $brace < 4 )
            return false;
    }
    $token = $data[0];
    switch ( $token ) {
        case 's' :
        if ( $strict ) {
            if ( '"' !== substr( $data, -2, 1 ) ) {
                return false;
            }
        } elseif ( false === strpos( $data, '"' ) ) {
            return false;
        }
        // or else fall through
        case 'a' :
        case 'O' :
        return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
        case 'b' :
        case 'i' :
        case 'd' :
        $end = $strict ? '$' : '';
        return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data );
    }
    return false;
}
?>