Notice: unserialize() Error at offset

2012-10-04   来源:站长日记       编辑:沧海桑田   类别:PHP 教程    转载到:    发表评论

Notice: unserialize() [function.unserialize]: Error at offset 可能的原因 ,1.编码问题 2.格式问题

Notice: unserialize() [function.unserialize]: Error at offset 可能的原因 和解决办法

1.编码问题
2.格式问题
编码问题
数据库 增加数据时 程序用的编码 比如是ANSCII编辑, 数据库用UTF-8编码,编码不同,就出现错误了.

例子:
以ANSCII方式操作
$arr = array('en' => 'hello', 'cn' => '您好');
$str = serialize($arr);
echo $str;
?>
输出结果: a:2:{s:2:"en";s:5:"hello";s:2:"cn";s:4:"您好";}

以UTF-8的编码方式来测试 ,则以上代码的输出结果为: a:2:{s:2:"en";s:5:"hello";s:2:"cn";s:6:"您好";}

中文字符长度不一样,strlen('您好')在第一种编码中是4,而在第二种编码中是6,
而unsrialize()要根据类似 s:6:"您好" 中的6来判断字符长度并进行反序列,但原来的是4,字符长度不符,也就是出现了offset错误

解决办法: 将要反序列的字符串进行一次转换,代码 $str = preg_replace('!s:(d+):"(.*?)";!se', '"s:".strlen("$2").":"$2";"', $str );
或者用自己自定的函数来代替unserialize
function mb_unserialize($serial_str) { $out = preg_replace('!s:(d+):"(.*?)";!se', "'s:'.strlen('$2').':"$2";'", $serial_str );return unserialize($out);}”

麻烦的编码问题,在处理字符问题的时候,很多时候统一编码的好一点.

格式问题
如果原来数据不是经过serialize处理的,现在需要用序列反序列怎么办
批量处理原来的数据吧
检测字串是否是serialize处理过的,不是则处理

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;
$length = strlen( $data );
if ( $length < 4 )
return false;
if ( ':' !== $data[1] )
return false;
$lastc = $data[$length-1];
if ( ';' !== $lastc && '}' !== $lastc )
return false;
$token = $data[0];
switch ( $token ) {
case 's' :
if ( '"' !== $data[$length-2] )
return false;
case 'a' :
case 'O' :
return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
case 'b' :
case 'i' :
case 'd' :
return (bool) preg_match( "/^{$token}:[0-9.E-]+;$/", $data );
}
return false;
}

399

0
399|0 | 鲜花 VS 砸蛋 | 1255阅读 0评论 error
下一篇: php is_serialized
 
不想登录?直接点击发布即可作为游客留言。
昵称  邮箱 网站 验证码 = 1+1