??先奉勸大家,不懂?dāng)?shù)據(jù)和代碼的情況下就不要瞎JB改,改壞了自己又處理不了。然后又是我的事,幫你吧,我真的很忙,時(shí)間成本太高,不幫你吧,看你自己又解決不了,又不忍心看著你干著急......
??今天有個(gè)用戶在數(shù)據(jù)庫(kù)里面修改了序列化數(shù)據(jù),導(dǎo)致序列化數(shù)據(jù)損壞,網(wǎng)站部分設(shè)置數(shù)據(jù)丟失。??這種情況我也是第一次遇到,本來(lái)就非常忙,幫個(gè)忙又白白浪費(fèi)了幾個(gè)小時(shí)!
他在修改序列化數(shù)據(jù)前備份了序列化數(shù)據(jù),但是不知道怎么回事,重新保存序列化數(shù)據(jù)后會(huì)被截?cái)啵?code>unserialize也沒有用,折騰了半天最后總算是搞好了。
將下面的代碼添加到當(dāng)前使用的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;
}
按下面的方式進(jìn)行調(diào)試
//將序列化存儲(chǔ)在一個(gè)txt文件中,放在主題根目錄
$corruptedSerialization = file_get_contents(get_template_directory_uri().'/test.txt');
//嘗試取消對(duì)原始字符串的序列化
$unSerialized = unserialize($corruptedSerialization);
//萬(wàn)一發(fā)生故障,我們?cè)囍蘩硪幌?if(!$unSerialized){
$repairedSerialization = dahuzi_fix_serialized($corruptedSerialization);
$unSerialized = unserialize($repairedSerialization);
}
//如果你需要打印數(shù)據(jù)請(qǐng)使用下面的代碼
var_dump($unSerialized);
//使用serialize函數(shù)將其序列化,然后手動(dòng)復(fù)制序列化數(shù)據(jù)保存回?cái)?shù)據(jù)庫(kù)。
serialize($unSerialized);
新主題官方微信公眾號(hào)
掃碼關(guān)注新主題(XinTheme)官方公眾號(hào),本站動(dòng)態(tài)早知道。
發(fā)布本站最新動(dòng)態(tài)(新主題發(fā)布、主題更新)和WordPress相關(guān)技術(shù)文章。