【问题标题】:php unserialize a serialized object stored in a DB fieldphp反序列化存储在数据库字段中的序列化对象
【发布时间】:2014-11-25 18:53:54
【问题描述】:

我正在尝试序列化一个 php 对象然后反序列化它。

当我序列化,然后将获得的字符串放入文件中,然后读取文件并反序列化,一切正常。

当我序列化,然后将获得的字符串存储在数据库字段中,然后读回并尝试反序列化时,这是行不通的。 我注意到我从数据库中读取的字符串包含一些特殊字符(如 &quote;)。我试图通过使用 htmlspecialchars_decode 来摆脱这些,但反序列化仍然不起作用(消息:unserialize(): Error at offset 1774 of 24239 bytes)。当我尝试查看这些字符时,我没有看到任何特别之处。

有什么帮助吗?

【问题讨论】:

  • 你在数据库上使用什么字符编码?
  • 将其存储在 BLOB / BINARY 列中,而不是 TEXT 或 (VAR)CHAR 中。例如,某些属性的序列化包含 NULL 字节。
  • @Wrikken 是正确的。 serialize() 的文档甚至在 Return Value 部分提到了这一点。
  • @Barmar:啊,检查,感谢您的链接,我将其升级为完整答案。
  • 非常感谢。这真的很有帮助

标签: php


【解决方案1】:

将其存储在 BLOB / BINARY 列中,而不是 TEXT 或 (VAR)CHAR 中。例如,某些属性的序列化包含 NULL 字节。

正如@Barmar 所说,documentation states this explicitly:

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

举例说明:

<?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])).")";
}

视觉输出:

O:3:"Foo":1:{s:8:"Foobar";s:3:"baz";}

但是:眼睛可以看到的东西更多:

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.

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2014-11-18
    相关资源
    最近更新 更多