遍历sql文件和项目文件,查询表名出现过的文件
admin
2023-06-21 05:21:23
0次

最近在整理项目的数据库的内容,有两个问题是要解决的,一个问题是有些表已经没有在文件里跑了,我需要筛选掉,一个问题是还在用的那些表,分别是在哪些文件里跑的?

数据表我统计了一下,有200+。项目的控制器文件,当然是两个文件夹,一个关于前台的,一个关于后台的。

然后,逻辑上是这样的,先把sql文件遍历一遍,取出所有表名,再把每个表名去两个文件夹里跑一遍。

写这个程序,有三个头是必不可少的:

header("Content-type: text/html; charset=utf-8");
error_reporting(0);
set_time_limit(0);

其实一般都是等到出现问题,再加上这三个头的...

先说说遍历sql文件,取出表名,其实很容易,不过正则表达式我写不好,就用str_replace函数代替了。

    function sqlarr($mdir)
    {
        $str=file_get_contents($mdir);
        if(!$str)
        {
            echo '';return false;
        }
        $pattern = '/表的结构 \`.*\`/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("表的结构 ","",$value);
            $v2 = str_replace("head_","",$value);
            //不能是带日期的错误文件
            $w = '/-/isU';
            preg_match_all($w,$v2,$mm);
                if (!$mm[0]) {
                    $arr[] = $v2;
                }
        }
      return $arr;
    }

$mdir就是sql文件的路径了,因为有些带日期的错误文件,也被我筛选掉了,值得一提,这是phpmyadmin导出来的sql文件,一般是可以用这个方法找出所有表名的。

然后就是将返回的数组进行循环,每个值都对文件进行遍历就行了。

    $mSqlArr = sqlarr('URL');
        foreach ($mSqlArr as $k => $v) {
        $k++;
        echo '

'.$v.'('.$k.')

';         listDir("./",$v);     }

listDir()就是遍历函数了。这样子,会输出表名和表名的排序。对两百多个表名来说,这个查询过程很久,程序至少需要运行十几分钟。

下一步就是listDir这个递归函数了,这个没什么好说的,写出来调试就可以了,我的代码是这样的:

function listDir($dir,$keyword)
{
//前台的有效文件
$arrA = array();
//后台的有效文件
$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 "
Action路径:",$dir.$file,"
";             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 .= '  次数:'.$num;               //前台               if($dir == './A/Lib/Action/')               {                 if(in_array($file,$arrA))                 {                   $con .= '(有效)

';                   $a_files .= $file.'、';                 }                 else                 {                   $con .= '(无效)

';                 }               }               elseif($dir == './B/Lib/Action/')               {                 //后台                 if(in_array($file,$arrB))                 {                   $con .= '(有效)

';                   $b_files .= $file.'、';                 }                 else                 {                   $con .= '(无效)

';                 }               }               else               {                 $con .= '(未知)

';               }             }             //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; }

这个函数的作用,就是让表名到两个文件夹里去循环,输出含有该表名的文件名称了,$arrA和$arrB就是给他判断哪些是有效文件了(有些文件我知道作废了)。

从路径上看可知,这是thinkphp的目录结构,是控制器放置的文件夹。

第一个参数是路径,第二个参数是关键字,也就是表名。

最后,我写了个可以简单查询单独一个表名情况的代码。

    $keyword = isset($_POST['keyword'])?$_POST['keyword']:'';
    //一律小写,删除空格
    $keyword = str_replace(' ','',strtolower($keyword));
    echo '';
    echo '搜索的表名:'.$keyword.'
';     if(!$keyword){echo '';return false;}     //开始运行     listDir("./",$keyword);

这里有个得到当前域名的函数:

    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;
    }

最后,就大功告成了。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...