繁体   English   中英

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

[英]Can't unserialize a string in php

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

但是到目前为止,没有人为我工作。

我在wordpress中有一个博客,他使用序列化数据来存储一些自定义字段。 它工作得很好,但是当我将所有博客都移到另一个文件夹时,所有序列化的数据均来自wordpress(但仍在数据库中),因此,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,并且我的数据按预期工作:\\我需要做其他事情吗?

$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)

最近,我遇到了这个完全相同的问题,花了无数小时来寻找恢复不良数据的方法。 我遍历了Spyropress主题中的每个函数和代码行,直到它导致我在WordPress中逐页浏览函数,最后使我明白了may_unserialize()失败了。

这使我开始寻找原因,为什么我偶然发现了像这样的几个线程,指出了如何减少字符串计数。 事实证明,已经对整个数据库中的数据执行了查找/替换,从而破坏了以主题构建的大量页面。

就我而言,我必须自动执行“修复”,然后将代码发布到另一个线程中。 我不确定是否最好在此处发布或只是链接到那里,所以我正在链接。 您可以在此处看到我的代码“修复”序列化数据:

方便的代码可自动修复损坏的序列化数据字符串计数

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

干杯!

您要分配两次数据。

第一次作业

$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"; 但您可能已经注意到,所提供的url的长度是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 ...这应该并且也不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM