您好,登錄后才能下訂單哦!
最近在整理項(xiàng)目的數(shù)據(jù)庫(kù)的內(nèi)容,有兩個(gè)問(wèn)題是要解決的,一個(gè)問(wèn)題是有些表已經(jīng)沒(méi)有在文件里跑了,我需要篩選掉,一個(gè)問(wèn)題是還在用的那些表,分別是在哪些文件里跑的?
數(shù)據(jù)表我統(tǒng)計(jì)了一下,有200+。項(xiàng)目的控制器文件,當(dāng)然是兩個(gè)文件夾,一個(gè)關(guān)于前臺(tái)的,一個(gè)關(guān)于后臺(tái)的。
然后,邏輯上是這樣的,先把sql文件遍歷一遍,取出所有表名,再把每個(gè)表名去兩個(gè)文件夾里跑一遍。
寫(xiě)這個(gè)程序,有三個(gè)頭是必不可少的:
header("Content-type: text/html; charset=utf-8"); error_reporting(0); set_time_limit(0);
其實(shí)一般都是等到出現(xiàn)問(wèn)題,再加上這三個(gè)頭的...
先說(shuō)說(shuō)遍歷sql文件,取出表名,其實(shí)很容易,不過(guò)正則表達(dá)式我寫(xiě)不好,就用str_replace函數(shù)代替了。
function sqlarr($mdir) { $str=file_get_contents($mdir); if(!$str) { echo '<script>';echo 'alert(\'文件路徑不存在!\');';echo '</script>';return false; } $pattern = '/表的結(jié)構(gòu) \`.*\`/isU'; preg_match_all($pattern, $str, $match); $match = array_unique($match[0]); static $arr = array(); foreach ($match as $key => $value) { $value = str_replace("`","",$value); $value = str_replace("表的結(jié)構(gòu) ","",$value); $v2 = str_replace("head_","",$value); //不能是帶日期的錯(cuò)誤文件 $w = '/-/isU'; preg_match_all($w,$v2,$mm); if (!$mm[0]) { $arr[] = $v2; } } return $arr; }
$mdir就是sql文件的路徑了,因?yàn)橛行掌诘腻e(cuò)誤文件,也被我篩選掉了,值得一提,這是phpmyadmin導(dǎo)出來(lái)的sql文件,一般是可以用這個(gè)方法找出所有表名的。
然后就是將返回的數(shù)組進(jìn)行循環(huán),每個(gè)值都對(duì)文件進(jìn)行遍歷就行了。
$mSqlArr = sqlarr('URL'); foreach ($mSqlArr as $k => $v) { $k++; echo '<br/><br/><b><font color="green">'.$v.'('.$k.')</font></b><br/><br/>'; listDir("./",$v); }
listDir()就是遍歷函數(shù)了。這樣子,會(huì)輸出表名和表名的排序。對(duì)兩百多個(gè)表名來(lái)說(shuō),這個(gè)查詢過(guò)程很久,程序至少需要運(yùn)行十幾分鐘。
下一步就是listDir這個(gè)遞歸函數(shù)了,這個(gè)沒(méi)什么好說(shuō)的,寫(xiě)出來(lái)調(diào)試就可以了,我的代碼是這樣的:
function listDir($dir,$keyword) { //前臺(tái)的有效文件 $arrA = array(); //后臺(tái)的有效文件 $arrB = array(); $a_files = ''; $b_files = ''; if(is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if((is_dir($dir."/".$file)) && $file!="." && $file!="..") { if($file == 'Action')echo "<hr><b><font color='red'>Action路徑:</font></b>",$dir.$file,"<br/>"; listDir($dir.$file."/",$keyword); } else { $extension=substr(strrchr($file, '.'), 1); //這里加篩選條件 if($file!="." && $file!=".." && $extension='php' ) { $content=file_get_contents($dir.$file); $parameter = 'M(\''.$keyword.'\')'; $match = strpos($content,$parameter); $num = substr_count($content,$parameter); if(!$match) { $con =''; } else { $file = str_replace("Action.class.php","",$file); $con = '文件名:'.$file; $con .= ' 次數(shù):'.$num; //前臺(tái) if($dir == './A/Lib/Action/') { if(in_array($file,$arrA)) { $con .= '<b><font color="blue">(有效)</font></b><br/><br/>'; $a_files .= $file.'、'; } else { $con .= '<b><font color="red">(無(wú)效)</font></b><br/><br/>'; } } elseif($dir == './B/Lib/Action/') { //后臺(tái) if(in_array($file,$arrB)) { $con .= '<b><font color="blue">(有效)</font></b><br/><br/>'; $b_files .= $file.'、'; } else { $con .= '<b><font color="red">(無(wú)效)</font></b><br/><br/>'; } } else { $con .= '<b><font color="green">(未知)</font></b><br/><br/>'; } } //file_put_contents('../test.php',$match,FILE_APPEND); print_r($con); ob_flush(); flush(); } } } closedir($dh); } } print_r($a_files); print_r($b_files); return false; }
這個(gè)函數(shù)的作用,就是讓表名到兩個(gè)文件夾里去循環(huán),輸出含有該表名的文件名稱了,$arrA和$arrB就是給他判斷哪些是有效文件了(有些文件我知道作廢了)。
從路徑上看可知,這是thinkphp的目錄結(jié)構(gòu),是控制器放置的文件夾。
第一個(gè)參數(shù)是路徑,第二個(gè)參數(shù)是關(guān)鍵字,也就是表名。
最后,我寫(xiě)了個(gè)可以簡(jiǎn)單查詢單獨(dú)一個(gè)表名情況的代碼。
$keyword = isset($_POST['keyword'])?$_POST['keyword']:''; //一律小寫(xiě),刪除空格 $keyword = str_replace(' ','',strtolower($keyword)); echo '<form method="post" action="'.GetCurUrl().'" ><input type="text" name="keyword"/><input type="submit" value="搜索表名" /></form>'; echo '搜索的表名:'.$keyword.'<br/>'; if(!$keyword){echo '<script>';echo 'alert(\'不能為空\(chéng)');';echo '</script>';return false;} //開(kāi)始運(yùn)行 listDir("./",$keyword);
這里有個(gè)得到當(dāng)前域名的函數(shù):
function GetCurUrl() { if(!empty($_SERVER["REQUEST_URI"])) { $scriptName = $_SERVER["REQUEST_URI"]; $nowurl = $scriptName; } else { $scriptName = $_SERVER["PHP_SELF"]; if(empty($_SERVER["QUERY_STRING"])) { $nowurl = $scriptName; } else { $nowurl = $scriptName."?".$_SERVER["QUERY_STRING"]; } } return $nowurl; }
最后,就大功告成了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。