PHP unserialize出错

最近碰到一个问题,在使用PHP的unserialize函数反序列化服务端传递过来的参数时报错了:unserialize() [function.unserialize]: Error at offset 180 of 181 bytes。最后在Stackoverflow上找到了一个非常好的答案:这是由于序列化时字符串长度算错了导致的。作者还写了个校正长度的正则表达式,提供了一个用于计算序列化是否出错了的函数。导致序列化出错的原因通常是因为内容使用了双引号(”)而不是单引号(’),php与mysql编码不一致(UTF8),内容包括冒号(:)和引号(;)也会导致反序列化出错。
解决的方法是在serialize上加上base64函数,对数据做base64编码和解码:

$toDatabse = base64_encode(serialize($data));
$fromDatabase = unserialize(base64_decode($data)); 

当然更建议使用json_encode和json_decode的来处理数据的序列化和反序列化会更快,但有一些局限性(这里)
之前有碰到URL参数传递时base64_encode/base64_decode的坑,可以像下面这样处理:

function base64url_encode($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}

function base64url_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

参考链接:
unserialize() [function.unserialize]: Error at offset
PHP Serialize() & Unserialize() Issues
Handling a PHP unserialize offset error… and why it happens
PHP – Safely serialize and unserialze arrays
Why is base64_encode() adding a slash “/” in the result?
d

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据