是的,我知道。我看到很多关于它的问题。
但直到现在还没有人为我工作。
我在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));
我尝试使用数据库中的原始序列化字符串(第一行),结果返回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)
我最近遇到了同样的问题,花了无数个小时寻找恢复坏数据的方法。我浏览了Spypropress主题中的每一个函数和代码行,直到它引导我在WordPress中浏览了一页又一页的函数,最终让我明白maybe_unseralize()失败了。
这让我开始思考为什么,我偶然发现了几个像这样的线程,指出了字符串计数是如何被关闭的。事实证明,在整个数据库中,对数据进行了查找/替换,破坏了大量使用主题构建的页面。
在我的情况下,我必须自动执行一个"修复",然后我在另一个线程中发布了我的代码。我不确定是在这里发布更好还是在那里链接更好,所以我正在链接。你可以在这里看到我的代码来"修复"序列化数据:
方便的代码自动修复损坏的序列化数据字符串计数。
我的解决方案适用于大型数据集,其中包含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
。。。这不应该也不可能奏效。