3

PHPを使用してmysqlクエリですべてのテーブルを検出したい。通常のクエリで機能する mysql_field_table() 関数を見ました。しかし、テーブルに代替名 ( table_name AS new_name ) を使用すると、正規表現で修正しても、実際の名前ではなく代替名が返されます。しかし今、私の問題は次のような高度なクエリにあります:

SELECT mail_id, mail_date, mail_from, mail_to, mail_subject, (
            (
            SELECT COUNT(*)
            FROM `sys_messagecenter_qmails`
            WHERE qmail_mail_id = mail_id
            ) + (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            WHERE rel_mail_id = mail_id
            )
            ) AS email_total, (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            WHERE rel_mail_id = mail_id
            ) AS email_sent, (
            SELECT COUNT(*)
            FROM `sys_messagecenter_rels`
            INNER JOIN `sys_email_receives` ON receive_reply_to = rel_sent_id
            WHERE rel_mail_id = mail_id
            ) AS email_reply FROM `sys_messagecenter_emails` WHERE mail_draft='No' 
ORDER BY mail_id ASC LIMIT 0,10 

今、クエリで実際のテーブル名をすべて検出するには、正規表現が必要だと思います。または他の完璧なソリューション。これどうやってするの?

4

4 に答える 4

3

申し訳ありません...ここでそれを抽出するための解決策(クエリがである場合$query

if(preg_match_all('/((FROM|JOIN) `(.*)`)/', $query, $matches)) {
    $tables = array_unique($matches[3]);
    print_r($tables);
}
于 2012-06-13T09:19:47.450 に答える
3

また、クエリからテーブル名を抽出する必要があります。次に、ほぼすべての基本的なクエリで動作する独自のスクリプトを作成します。

$tables = array();
$sql ="SELECT m.`id` FROM my_table m INNER JOIN mytable_2 m2 ON(m.`id` = m2.`m_id`) ";

    $query_structure = explode( ' ', strtolower( preg_replace('!\s+!', ' ', $sql) ) );

    $searches_from = array_keys( $query_structure , 'from');
    $searches_join = array_keys( $query_structure , 'join');
    $searches_update = array_keys( $query_structure , 'update');
    $searches_into = array_keys( $query_structure , 'into');
    $searches = array_merge($searches_join , $searches_from , $searches_update , $searches_into );
    foreach($searches as $search ){
        if(isset($query_structure[$search+1])){
            $tables[] = trim( $query_structure[$search+1] , '` ');
        }
    }
    print_r($tables);

これが役立つことを願っています

于 2016-03-20T12:16:49.187 に答える