首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php取消序列化存储在DB字段中的对象

php取消序列化存储在DB字段中的对象
EN

Stack Overflow用户
提问于 2014-11-25 18:53:54
回答 1查看 321关注 0票数 0

我正在尝试序列化一个php对象,然后取消它的序列化。

当我序列化,然后将获得的字符串放入一个文件中,然后读取该文件和取消序列化,所有工作正常。

当我序列化时,然后将获得的字符串存储在数据库字段中,然后将其读取回并尝试取消序列化,这是行不通的。我注意到,我从数据库中读取的字符串包含一些特殊字符(如“e;”)。我试图通过使用htmlspecialchars_decode来消除这些字符,但未序列化的字符串仍然无法工作(消息:un序列化():在偏移量为24239字节的1774字节处出现错误)。当我试图查看这些字符时,我看不到任何特殊的内容。

有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-25 19:09:09

将其存储在BLOB /二进制列中,而不是文本或(VAR)CHAR中。例如,某些属性的序列化包含空字节.

就像@Barmar说的,文档明确地说明了这一点。

请注意,这是一个二进制字符串,它可能包含空字节,需要这样存储和处理。例如,序列化()输出通常应该存储在数据库中的BLOB字段中,而不是CHAR或TEXT字段。

为了说明:

代码语言:javascript
运行
复制
<?php
class Foo { private $bar = "baz";} 
$string = serialize(new Foo()); 
echo $string.PHP_EOL;
for($i = 0; $i < strlen($string); $i++){ 
    echo $string[$i]."(".dechex(ord($string[$i])).")";
}

视觉输出:

代码语言:javascript
运行
复制
O:3:"Foo":1:{s:8:"Foobar";s:3:"baz";}

但是:还有比眼睛看得更多的东西:

代码语言:javascript
运行
复制
O(4f):(3a)3(33):(3a)"(22)F(46)o(6f)o(6f)"(22):(3a)1(31):(3a){..
    (7b)s(73):(3a)8(38):(3a)"(22)(0)F(46)o(6f)o(6f)(0)b(62)a(61)r(72)"
                                  ^ ----------------^-- there's two of your NULL bytes.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27134481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档