??先奉勸大家,不懂數據和代碼的情況下就不要瞎JB改,改壞了自己又處理不了。然后又是我的事,幫你吧,我真的很忙,時間成本太高,不幫你吧,看你自己又解決不了,又不忍心看著你干著急......
??今天有個用戶在數據庫里面修改了序列化數據,導致序列化數據損壞,網站部分設置數據丟失。??這種情況我也是第一次遇到,本來就非常忙,幫個忙又白白浪費了幾個小時!
他在修改序列化數據前備份了序列化數據,但是不知道怎么回事,重新保存序列化數據后會被截斷,unserialize
也沒有用,折騰了半天最后總算是搞好了。
將下面的代碼添加到當前使用的WordPress主題的functions.php中。
function dahuzi_fix_str_length($matches) {
$string = $matches[2];
$right_length = strlen($string); // yes, strlen even for UTF-8 characters, PHP wants the mem size, not the char count
return 's:' . $right_length . ':"' . $string . '";';
}
function dahuzi_fix_serialized($string) {
// securities
if ( !preg_match('/^[aOs]:/', $string) ) return $string;
if ( @unserialize($string) !== false ) return $string;
$string = preg_replace("%\n%", "", $string);
// doublequote exploding
$data = preg_replace('%";%', "μμμ", $string);
$tab = explode("μμμ", $data);
$new_data = '';
foreach ($tab as $line) {
$new_data .= preg_replace_callback('%\bs:(\d+):"(.*)%', 'dahuzi_fix_str_length', $line);
}
return $new_data;
}
按下面的方式進行調試
//將序列化存儲在一個txt文件中,放在主題根目錄
$corruptedSerialization = file_get_contents(get_template_directory_uri().'/test.txt');
//嘗試取消對原始字符串的序列化
$unSerialized = unserialize($corruptedSerialization);
//萬一發生故障,我們試著修理一下
if(!$unSerialized){
$repairedSerialization = dahuzi_fix_serialized($corruptedSerialization);
$unSerialized = unserialize($repairedSerialization);
}
//如果你需要打印數據請使用下面的代碼
var_dump($unSerialized);
//使用serialize函數將其序列化,然后手動復制序列化數據保存回數據庫。
serialize($unSerialized);
新主題官方微信公眾號
掃碼關注新主題(XinTheme)官方公眾號,本站動態早知道。
發布本站最新動態(新主題發布、主題更新)和WordPress相關技術文章。