无法在php中反序列化字符串

时间:2012-02-26 17:59:18

标签: php wordpress serialization

是的,我知道。我看到了很多关于它的问题。

但直到现在还没有人为我工作。

我在wordpress中有一个博客,他使用序列化数据来存储一些自定义字段。 它工作得很好,但当我将所有博客移动到另一个文件夹时,所有来自wordpress的序列化数据gonne(但它仍然在数据库中) 所以,wordpress没有检测到它。

现在......我想知道为什么不起作用的代码。 最后...我想,好吧,我会做一个代码来获取序列化数据,它会起作用。

现在我迷路了,我有这个:

$data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';
$data = "a:7:{s:4:1}";
$data = trim($data);
var_dump($data);
var_dump(unserialize($data));

我尝试使用数据库中的原始序列化字符串(fisrt行)并返回false和错误。 我做了一点简单,并说同样的。

我的错误是:

Notice: unserialize() [function.unserialize]: Error at offset 5 of 11 bytes in C:\xampp\htdocs\unser.php on line 6
bool(false) 

所以,我不知道为什么我无法从字符串中获取数据!

我尝试了这个工具http://unserialize.net/serialize,我的数据正常运作:\我还需要做其他事情吗?

3 个答案:

答案 0 :(得分:2)

$broken_data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';
$data = serialize(
    array(
        "zoom"      => "18",
        "latitude"  => "41.37233",
        "longitude" => "1.04283",
        "address_one"=>"Finca Riudabella",
        "address_two"=>" s/n - 43430 Vimbodí (Tarragona)",
        "pin"=>"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png",
        "bg_img"=> ""
    )
);
// The right data
var_dump($data);
// Your data.
var_dump($broken_data);
var_dump(unserialize($data));

正如您所看到的,$data的序列化是正确的。
序列化的$broken_data似乎在“pin”处具有不正确的字符串长度 在$broken_data中,它被称为77个字符(s:77),但实际上它长达67个字符(s:67)

答案 1 :(得分:1)

我最近遇到了这个完全相同的问题,花了无数个小时找到恢复坏数据的方法。我浏览了Spyropress主题中的每个函数和代码行,直到它引导我逐页浏览WordPress中的函数,最后让我理解maybe_unserialize()失败了。

这导致我想要弄清楚为什么,我偶然发现了像这样的一些线程,指出字符串计数如何关闭。事实证明,在整个数据库中对数据进行了查找/替换,破坏了大量使用主题构建的页面。

在我的情况下,我必须自动修复"修复",然后我将代码发布到另一个线程中。我不确定是否可以更好地发布在这里或只是链接那里,所以我链接。你可以看到我的代码来修复"序列化数据:

Handy code to automatically fix broken serialized data string counts

我的解决方案适用于大型数据集,包含HTML / CSS,转义双引号,换行符和大量特殊字符。我认为这可能会帮助那些在另一个之前找到这个页面的人(就像我一样)。

干杯!

答案 2 :(得分:0)

您要分配两次数据。

第一次分配

$data = 'a:7:{s:4:"zoom";s:2:"18";s:8:"latitude";s:8:"41.37233";s:9:"longitude";s:7:"1.04283";s:11:"address_one";s:16:"Finca Riudabella";s:11:"address_two";s:33:" s/n - 43430 Vimbodí (Tarragona)";s:3:"pin";s:67:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";s:6:"bg_img";s:0:"";}';

它失败了:s:77:"http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png";但您可能已经注意到提供的网址长度为67,当您手动将其更改为67时,并使用:var_dump( unserialize( $data));您将会得到这个:

array(7) {
  ["zoom"]=>
  string(2) "18"
  ["latitude"]=>
  string(8) "41.37233"
  ["longitude"]=>
  string(7) "1.04283"
  ["address_one"]=>
  string(16) "Finca Riudabella"
  ["address_two"]=>
  string(33) " s/n - 43430 Vimbodí (Tarragona)"
  ["pin"]=>
  string(67) "http://espaciosparaeventos.es/wp-content/uploads/2012/02/fincas.png"
  ["bg_img"]=>
  string(0) ""
}

它是如何改变的?我不知道,似乎没有特殊字符,也许实现Serializable的类为URL提供了错误的字符串长度。

第二次分配

$data = "a:7:{s:4:1}";

这是错误的,声明包含7个项目的数组,只提供一个...而且那个字符串应该是长度为4("str1"),而只提供1 ..这不应该也不行。