3

次の文字列があるとします(これが MySQL ステートメントであることは忘れてください)。

SELECT * FROM users WHERE name = 'fred bloggs' AND age=21 AND address='Mountain View, CA 94043' LIMIT 1

WHERE 句でフィールド名と値を抽出する方法が必要なので、次のような配列があります。

Array
(
    [name] => fred bloggs
    [age] => 21
    [address] => Mountain View, CA 94043
)

これは動的な MySQL 文字列であるため、名前、年齢、または住所をハードコードすることはできません。

私が予測できる問題は次のとおりです。

  • フィールド名を見つけると、関数は各フィールド名に一致するようにすべての有効な演算子を知る必要があります (以下で使用する配列を参照してください)。
  • スペースは保証されていません (例: age=21)
  • ' と ' 内の値を検索しますが、' が文字列内にある場合は壊れません
  • ' と ' で囲まれていない値 (数値やその他のフィールド名など) の検索 (個別に処理する必要があります)

正規表現または文字列関数のいずれかを使用してこれを行う方法を知っている人はいますか?

必要な場合の演算子は次のとおりです。

$operators = array('+', '-', '*', '/', '^', '=', '<>', '!=', '<', '<=', '>', '>=', 'like', 'clike', 'slike', 'not', 'is', 'in', 'between', 'and', 'or');
4

3 に答える 3

4

この種のツールで試すことができます: http://code.google.com/p/php-sql-parser/

クエリを説明するツリー (配列) を取得します。これは、必要な配列を構築するのに役立ちます。

于 2011-03-02T11:03:31.007 に答える
2

そのための式パーサーを作成する必要がありますが、 regex では実現できません。たとえば、結果の配列には、指定したすべてのノード タイプ (OR、AND、IN、BETWEEN など) を持つ式ツリーが含まれます。Web に例があります

于 2011-03-02T10:42:16.853 に答える
0

これにアプローチする方法はおそらくいくつかあります。

1)クエリからメタデータを探します。結果セットに関する情報を取得できることは知っていますが、元のクエリについてはわかりません。どこかにありますが、からかう必要があるかもしれません。

2)プリペアドステートメントを使用して、断片からクエリを構築します。配列内のさまざまなwhere条件を渡します。ただし、その種類は逆方向です(つまり、必要な回答から始めて、クエリを作成します)。

于 2011-02-24T17:28:07.110 に答える