Php 为什么当我尝试取消序列化某些东西时,结果只是空的?

Php 为什么当我尝试取消序列化某些东西时,结果只是空的?,php,serialization,deserialization,Php,Serialization,Deserialization,例如,我有字符串 a:1:{i:0;a:3:{s:4:"name";s:56:"Song → Black Meen : “So Clean (feat. Dullaah Jin)”";s:4:"file";s:98:"http://localhost/peace.worldwide/wp-content/uploads/2013/05/03-So-Clean-feat.-Dullaah-Jin.mp3";s:9:"condition";s:3:"all";}} 我想取消它的序列化 当我将其传递

例如,我有字符串

a:1:{i:0;a:3:{s:4:"name";s:56:"Song → Black Meen : “So Clean (feat. Dullaah Jin)”";s:4:"file";s:98:"http://localhost/peace.worldwide/wp-content/uploads/2013/05/03-So-Clean-feat.-Dullaah-Jin.mp3";s:9:"condition";s:3:"all";}}
我想取消它的序列化

当我将其传递给unserialize()时,结果为nothing(例如,
print\r(unserialize(/*我将字符串放在这里*/)
prints绝对为nothing)


为什么会发生这种情况?

打开错误报告中的通知:

PHP Notice:  unserialize(): Error at offset 204 of 229 bytes in php shell code on line 1
在这些偏移量周围有一个

s:98:"http://localhost/peace.worldwide/wp-content/uploads/2013/05/03-So-Clean-feat.-Dullaah-Jin.mp3"

这表示应该有一个长度为98的字符串,但该字符串只有93字节长。

我发现了导致数据库中序列化字符串混乱的问题。我搜索/替换了基于数据的内容,将str8wayent.com替换为localhost,这显然会更改序列化值,但不会更改数据库中的长度字段

我在sql转储文件中找到了一个很好的脚本,用于固定序列化长度字段:

我修正了我的问题。一开始我没想到。但在我的例子中,数字是匹配的。@trusktr
var_dump(unserialize('a:1:{i:0;a:3:{s:4:name;s:4:blah;s:4:file;s:25:http://localhost/blah.mp3“s:9:”条件“s:3:”全部“}”)给出
array(1){[0]=>array(3){[“name”]=>string(4)“blah”[“file”]=>string(25)”http://localhost/blah.mp3“[“条件”]=>字符串(3)“全部”}
Hmmm。。我的显示为
bool(false)
。。。我会把真实的东西贴出来。我认为这是无害的。您的长度又错了:url前面有
s:98
,但这与字符串长度(93.Hmmm)不匹配。。。。但这是数据库中未修改的实际字符串。在我取消序列化之前,是否需要对它进行某种类型的操作?(使用它的应用程序似乎工作得很好)。顺便说一句,我很好奇,你为什么要使用序列化?我正在从数据库中提取它。我没有制作原始的应用程序,但我使用它放在数据库中的数据。我会使用
JSON
。更可靠的是,您可以使用
PHP
以外的其他语言将数据解析为对象/数组。这是真的,我完全愿意,但我没有制作原始应用程序,因此我必须找出如何修改所有这些。我以为我可以把它取消序列化,但我想不行。字符串(包含不正确的长度字段)是应用程序正在使用的内容,并且应用程序可以正常工作。我得多挖点,看看原因。