4

PHP を使用してクエリからすべてのテーブル名を取得しようとしました。この関数を使用して、複数のテーブルを持つ JOINS を除くすべての条件を取得しました。この同じ関数を使用して、JOIN クエリも抽出するのを手伝ってください。

private function get_tables($query)
{
    $arr        =   explode("FROM", $query);
    $second     =   $arr[1];

    if($second==""){
        $arr    =   explode("from", $query);
        $second =   $arr[1];
    }

    $consts =   array('where','order', 'group', 'limit');
    $check=1;

    for($i=0;$i<count($consts); $i++)
    {
      if((stristr($second,$consts[$i])  !=  '')&&($check==1))
      {
          $where    =   explode($consts[$i],$second);
          if($check == 1)
          {
              $check=2;
              $tables= $where[0];
          }
      }
    }
    if($check == 1)
    {
      $tables= $arr[1]; 
    }
    $tab_arr    =   explode(',',$tables);
    $name_arr   =   array();

    foreach($tab_arr as $name)
    {
      if($name != '')
      { 
          $name =   trim($name);
          $narr =   explode(' ',$name);     
          $name_arr[]   =   $narr[0];
      }

    }
    $name_arr   =   array_unique($name_arr);
    return $name_arr;
}
4

2 に答える 2

2

単純な正規表現マッチングで SQL を解析することはできません...テーブルに別名が付けられるとどうなりますか? サブクエリがあるときは?交差結合? 組合?など。SQL 文法は非常に豊富です。

SQL パーサーを探します。例えば:

https://code.google.com/p/php-sql-parser/

于 2013-06-12T08:24:08.350 に答える
2

おそらく、すべてのテーブルを選択してクエリで検索できます

mysql:
1 つのデータベースの SQL:

SHOW TABLES FROM {database_name};

すべてのデータベースの SQL:

SELECT * FROM information_schema.tables 
WHERE TABLE_TYPE = 'BASE TABLE';

そしてクエリで見つけます:

$find_in_this_query = "your query";

$result = mysql_query("SHOW TABLES FROM sample_database;");

while ($row = mysql_fetch_row($result)) {
    if (strpos($find_in_this_query, $row[0]) !== false) {
        $found[] = $row[0];
    }
}

print_r($found);
于 2013-06-12T08:52:39.963 に答える