2009-03-31 11 views
0

MySQLクエリを取得し、各テーブル名の前に文字列を挿入する必要があります。解は1行である必要はありませんが、明らかに正規表現の問題です。 PHPで実装されるので、プログラミングロジックもうまくいきます。RegEx、MySQLクエリの各テーブルの前に文字列を挿入する

理由と背景: テーブルプレフィックス(例: 'users'ではなく 'nx_users')を許可するようにコードベースを変更していますので、私はそれを自動化する関数を持っていますすべてのクエリを見つけて手動で変更する必要はありません。

例:接頭辞 'nx_' を使用して

SELECT * FROM users, teams WHERE users.team_id = teams.team_id ORDER BY users.last_name 

、それは明らかに、それは、このようなテーブルのエイリアス、結合、および他の一般的なMySQLのコマンドなどの他の例を処理する必要があり

SELECT * FROM nx_users, nx_ teams WHERE nx_ users.team_id = nx_ teams.team_id ORDER BY nx_ users.last_name 

に変更する必要があります。

誰でもこれを行っていますか?

答えて

3

私たちはここでどの程度のコードベースを話していますか?このようなものの正規表現は真剣に災害に悩まされています。私はおそらくあなたのコード内にあるmysql_queryなどを探して自分で変更する方が良いと思うでしょう。正規表現を実装して間違いなく欠けてしまうすべてのケースを修正するのに費やす時間は、1時間以上かかるべきではありません。

+0

私は通常は同意しますが、実際には実行されるソリューションであることを意味します。これは、他の開発者も同様に書く予定のウェブアプリの一部です。これを確実に使うことができれば、私にとって長期的にはより良いことです。 – Paulo

+0

+1。これを*確実に*使用することはできません。特に、SQLを解析する権限を持っていない正規表現では使用できません。いくつかの言語/プラットフォームで使用できる適切なSQLパーサーがありますが、それでもそれでもなお危険な命題です。 – bobince

0

まず、正規表現だけではタスクが実行できません。あなたは、SQLを解析し、変更可能な解析ツリーを生成した後、修正解析ツリーから変更されたSQLを放出するものが必要

select sender from email where subject like "from users group by email" 

本当にこれを行うには:のようなものを考えてみましょう。それで、それは実行可能ですが、(パオロが与えた理由のために)お勧めできません。

より良いアプローチは、テーブル名、SQLの送信に使用する関数、単語からの関数、スクリプトのようなものを探して、それらのポイントでエディタにあなたを投げることです。

2

正規表現を使用してコードを書き直すと、問題が発生します。

この文字列を動的に変更する必要がある場合は、SQLロジックを1つの場所に分割し、すべてのSQLクエリに適切に配置される$ table_prefix変数を設定する必要があります。この変数は、呼び出しコードによって設定できます。

$query = "SELECT foo from " . $table_prefix . "bar WHERE 1"; 

これをクラスにカプセル化している場合は、すべてが優れています。

この例では、エスケープやセキュリティの問題は考慮していません。

+0

+1これは私があまりにもお勧めするものです。 –

関連する問題