0

人々が値を入力できる7つの入力ボックスがあります。これらの値はテーブルと比較され、最終的に結果がロールアウトされます。これが検索機能です。これで、3 つの入力ボックスを含むページが作成され、次のように記述されました。

if (box1 is filled && box2 is filled & box 3 is filled) {
sql="take all three values into account when comparing..";
}

if (box1 is not filled && box2 is not filled & box 3 is nog filled) {
sql="take no values into account when comparing..";
}

and so on...

3 つのボックスの場合、これで問題ありません。3 つのボックスの組み合わせはごくわずかです。ただし、これは 7 ボックスでは実行できません。より多くの組み合わせが得られます。入力されたフィールドに基づいて SQL を信頼できるようにするにはどうすればよいですか? 皆さんが賢い解決策を持っていることを願っています!

4

2 に答える 2

2

COALESCE(または)を使用できますISNULL

...
WHERE Column1 = COALESCE(@Column1, Column1) 
AND   Column2 = COALESCE(@Column2, Column2) 
...
AND   Column7 = COALESCE(@Column7, Colum7) 

そのため、パラメータが null でない場合にのみ、WHEREそのフィールドに適用されます。

于 2012-10-16T15:36:13.870 に答える
1

クエリを分割して作成します。好き:

StringBuilder where=new StringBuilder();
String conj=" where ";
if (box1.length()>0)
{
  where.append(conj).append("value1=").append(esc(box1));
  conj=" and ";
}
if (box2.length()>0)
{
  where.append(conj).append("value2=").append(esc(box2));
  conj=" and ";
}
... etc ...
String sql="select value1, value2, value3 from mytable" + where.toString();

いくつかのメモ:

どのフィールドの組み合わせを入力できるかわからないと仮定すると、組み合わせを正しくするために何らかの遊びをする必要があるかもしれません。つまり、クエリに「where and value2='x'」と言わせたくない場合があります。上記のコードは、最初の条件の前に「where」を置き、次の各条件の前に「and」を置きます。

補足:このようなクエリを作成するときは、SQLインジェクションを監視する必要があります。引用符を2倍にするエスケープ関数(ここでは「esc」と呼んでいると仮定します)を記述します。ほとんどのSQLエンジンでは、心配する必要があるのはそれだけです。バックスラのような他の魔法のキャラクターを持っている人もいますが、それも逃げる必要があります。または、準備されたステートメントを作成してから、戻って値を入力することもできます。これはより安全ですが、どのフィールドが2回入力されたかを確認する必要があります。1回目はSQLを構築し、2回目は値を入力します。これは少し面倒ですが、より安全です。ユーザーが入力した値を取得して、「'" + value +"'」を入力するだけでSQLステートメントにプラグインすることは決してありません。これにより、「」と入力したハッカーに広く開放されます。 '

于 2012-10-16T15:58:53.003 に答える