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

php取消序列化存储在DB字段中的序列化对象,php,Php,我试图序列化一个php对象,然后取消序列化 当我序列化,然后将获得的字符串放入文件中,然后读取文件并取消序列化时,一切正常 当我序列化,然后将获取的字符串存储在数据库字段中,然后将其读回并尝试取消序列化时,这是行不通的。 我注意到从数据库中读取的字符串包含一些特殊字符(如"e;)。我试图通过使用htmlspecialchars_decode来消除这些错误,但unserialize仍然不起作用(消息:unserialize():24239字节的偏移量1774处的错误)。当我试图看到那些角色

我试图序列化一个php对象,然后取消序列化

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

当我序列化,然后将获取的字符串存储在数据库字段中,然后将其读回并尝试取消序列化时,这是行不通的。 我注意到从数据库中读取的字符串包含一些特殊字符(如"e;)。我试图通过使用htmlspecialchars_decode来消除这些错误,但unserialize仍然不起作用(消息:unserialize():24239字节的偏移量1774处的错误)。当我试图看到那些角色时,我看不到任何特别的东西


有什么帮助吗?

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

正如@Barmar所说的那样:

请注意,这是一个二进制字符串,可能包含空字节,因此需要进行存储和处理。例如,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(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.

您在数据库上使用什么字符编码?将其存储在BLOB/二进制列中,而不是文本或(VAR)字符中。例如,某些属性的序列化包含空字节。@Wrikken是正确的。的文档甚至在返回值部分提到了这一点。@Barmar:啊,检查一下,谢谢你的链接,我将把它升级为完整答案。非常感谢。这真的很有帮助
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.