遍历sql文件和项目文件,查询表名出现过的文件

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

数据表我统计了一下,有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 ‘<script>‘;echo ‘alert(\‘文件路径不存在!\‘);‘;echo ‘</script>‘;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 ‘<br/><br/><b><font color="green">‘.$v.‘(‘.$k.‘)</font></b><br/><br/>‘;
        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 "<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 .= ‘&nbsp;&nbsp;次数:‘.$num;
              //前台
              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">(无效)</font></b><br/><br/>‘;
                }
              }
              elseif($dir == ‘./B/Lib/Action/‘)
              {
                //后台
                if(in_array($file,$arrB))
                {
                  $con .= ‘<b><font color="blue">(有效)</font></b><br/><br/>‘;
                  $b_files .= $file.‘、‘;
                }
                else
                {
                  $con .= ‘<b><font color="red">(无效)</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;
}

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

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

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

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

    $keyword = isset($_POST[‘keyword‘])?$_POST[‘keyword‘]:‘‘;
    //一律小写,删除空格
    $keyword = str_replace(‘ ‘,‘‘,strtolower($keyword));
    echo ‘<form method="post" action="‘.GetCurUrl().‘" style="position:fixed;top:100px;right:200px;"><input type="text" name="keyword"/><input type="submit" value="搜索表名" /></form>‘;
    echo ‘搜索的表名:‘.$keyword.‘<br/>‘;
    if(!$keyword){echo ‘<script>‘;echo ‘alert(\‘不能为空\‘);‘;echo ‘</script>‘;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;
    }

最后,就大功告成了。

时间: 2024-08-26 14:05:41

遍历sql文件和项目文件,查询表名出现过的文件的相关文章

SQL Server 2000中查询表名,列名及字段类型

经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjects Where name like '%user%' 如果知道列名,想查找包含有该列的表名,可加上系统表syscolumns来实现,如想查找列名中包含有user的所有表名,可通过以下SQL语句来实现 Select * From sysobjects s Where Exists( Select *

Python os模块实例之遍历目录及子目录指定扩展名的文件

需求:在该目录下有很多子目录(如下图,截图了部分),现要从该目录和所有子目录下找到所有扩展名为.meta的文件,并获取文件中第二行guid的值(': '后面的),然后将所有guid的值输出到另一文件中 .meta文件截图: 思路: 遍历当前目录的子目录,如果是文件并且扩展名为.meta,获取guid,写入到guid.txt:如果是子目录,则遍历子目录下的文件. 方法一: #!usr/bin/env python # -*- coding: utf-8 -*- import os outfile

java批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码

原文:java批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码 源代码下载地址:http://www.zuidaima.com/share/1550463660264448.htm 今天有个需求,想把某个文件夹下所有后缀名为jsp的更改为ftl,本来想用bat实现对bat的高级语法也不太了解,后来发现还需要递归遍历所有的子文件夹,所以用java实现了一个功能一样的代码,有需要的牛人可以下载修改为自己想要的. 这样可以兼容windows和linux. package com.zuidaima

Java 遍历指定文件夹及子文件夹下的文件

/** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @param file 要遍历的指定文件夹 * @param collector 符合条件的结果加入到此List<File>中 * @param pathInclude 路径中包括指定的字符串 * @param fileNameInclude 文件名称(不包括扩展名)中包括指定的字符串 * @param extnEquals 文件扩展名为指定字

如何让SQL Server数据库自动备份并压缩成rar文件

1.  先开启xm_cmdshell服务 xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出.由于xp_cmdshell 可以执行任何操作系统命令,所以一旦SQL Server管理员帐号(如sa)被攻破,那么攻击者就可以利用xp_cmdshell 在SQL Server中执行操作系统命令,如:创建系统管理员,也就意味着系统的最高权限已在别人的掌控之中.由于存在安全隐患,所以在SQL Server 2005中, xp_cmdshell

SqlServer查询表名的备注(查询表名描述 MS_Description)

查询表名描述 MS_Description ? 1 2 3 4 5 SELECT tbs.name 表名,ds.value 描述       FROM sys.extended_properties ds  LEFT JOIN sysobjects tbs ON ds.major_id=tbs.id  WHERE  ds.minor_id=0 and tbs.name='ScheduleRecords';--表名 添加表的描述 ? 1 EXECUTE sp_addextendedproperty

linxu的文件类型和扩展名

1)windows 里是通过扩展名来区分文件类型的. 2)linux里文件扩展名和文件类型没有关系. 3)为了容易区分和兼容用户使用windows的习惯,我们也会用扩展名来区分文件类型. 在linux系统中,可以说一切皆文件. 文件类型包含有普通文件.目录.字符设备文件.块设备文件.符号链接文件等: -type c              File is of type c: b      block (buffered) special c      character (unbuffere

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

matlab从文件夹名中获得该文件夹下所图像文件名

function [s,nameC]=get_FileNameFromFolderPath(path) % 函数调用:[s,nameC]=get_FileNameFromFolderPath(path) % 函数功能:从文件夹名中获得该文件夹下所图像文件名 % 函数输入:path 为文件夹路径 % 函数输出:s 表示状态,当为0时表示正确 % nameC 表示获得的图像名的胞体cell % 函数历史:v0.0 @2013-01-27 created by Aborn cmd = sprintf(