PHP 恢復MySQL 備份文件裡面有多個“;” 導致程序出錯。
這個是我用上個文檔寫的PHP備份MySQL生成的SQL備份腳本文件。
今天,要編寫的是SQL恢復的功能,可是失敗了。經過我的檢查發現是SQL裡面的“;”
所導致的,我分析了,織夢CMS的代碼,它是做表結構還有,內容放到不同的文件裡面。而又有規律,以下是織夢的代碼。
if($startgo==0 && $structfile!='')
{
$tbdata = '';
$fp = fopen("$bkdir/$structfile",'r');
while(!feof($fp))
{
$tbdata .= fgets($fp,1024);
}
fclose($fp);
$querys = explode(';',$tbdata);
foreach($querys as $q)
{
$dsql->ExecuteNoneQuery(trim($q).';');
}
if($delfile==1)
{
@unlink("$bkdir/$structfile");
}
$tmsg = "<font color='red'>完成數據表信息還原,准備還原數據...</font>";
$doneForm = "<form name='gonext' method='post' action='sys_data_done.PHP?dopost=redat'>
<input type='hidden' name='startgo' value='1' />
<input type='hidden' name='delfile' value='$delfile' />
<input type='hidden' name='bakfiles' value='$bakfilesTmp' />
</form>\r\n{$doJS}\r\n";
PutInfo($tmsg,$doneForm);
exit();
}
其中,最重要的就是這三句了。
$querys = explode(';',$tbdata);
foreach($querys as $q)
{
$dsql->ExecuteNoneQuery(trim($q).';');
}
織夢,它也遇到這個問題了。而普通的install備份則,都是每條是一行。所以代碼如下:
$fp = fopen("$bkdir/$nowfile",'r');
while(!feof($fp))
{
$line = trim(fgets($fp,512*1024));
if($line=="")
{
continue;
}
$rs = $dsql->ExecuteNoneQuery($line);
if($rs)
{
$oknum++;
}
}
而我的問題和它們不一樣。我是把所有的數據備份到,同一個SQL備份文件裡面,用$querys = explode(';',$tbdata);折分得到數組在,foreach吧,不太現實,因為有的INSTALL裡面也會有“;” ,雖然那種可能不大。
我最後決定使用,每個SQL一行的方法來解決這個問題。
不過,我又看到PHPmyadmin發現那個就是把一大堆的SQL復制進去,它就可以正常執行,它用的什麼技術來做到的呢。
編程不能不求甚解。切記。