0

SQL、ASP.NET、およびクエリ文字列パラメーターを使用して、簡単なテーブル フィルター処理を実行しようとしています。「検索」テキスト フィールドと「価格」テキスト フィールドを含むフォームが存在するようにプロジェクトをセットアップしました。フォームを送信すると、次のようにクエリ文字列パラメーターが更新されます。

mydomain.com?search=test&price=100

SQL ステートメントは検索条件を満たす行を返す必要がありますが、一方が空白の場合でも、もう一方はデータを返す必要があります。現在、'search' と 'price' の両方が有効な場合は正しい行が返されますが、どちらかが空の場合は何も返されません。

ここに私のコードスニペットがあります:

var search = Request["search"].IsEmpty() ? "" : Request["search"];
var price = Request["price"].IsEmpty() ? "" : Request["price"];

string sql = "SELECT * FROM Items WHERE ('%" + search + "%' is null OR item_name LIKE '%" + search + "%') AND ('%" + price + "%' is null OR item_price < " + price + ")";

「値が null である」ステートメントが true の場合、() 内の「AND」ステートメント全体が null に設定されているため、無視されることを理解しています。false の場合、'OR..' ステートメントが実行されます。

SQL ステートメントが正常に機能しないのはなぜですか?

4

2 に答える 2

4

これに対する興味深い小さな解決策を見つけました。ちょっとハックですが、動作します:

var sql = "SELECT * FROM table WHERE 1 == 1";
var search = "blahdiblah";
if search is not "" {
    sql += " AND item LIKE '%"+search+"%'";
}

コードに合わせてください。

したがって、最初は「すべてをください」と言ってから、値があるかどうかに基づいて、要求されたデータを AND と OR で削り始めます。

神への愛のために、インライン SQL を削除してください!!! 私はコメントで冗談を言っていませんでした。私の構文が正しい場合、誰かが');DROP TABLE Items;--検索テキスト ボックスに入力すると、テーブル全体が削除されます。その行は、引用符を閉じ、ステートメントを終了し、テーブルを削除して、残りをコメントアウトします。結果の行は次のようになります。

SELECT * FROM Items WHERE ('%');DROP TABLE Items;--%' is null OR item_name LIKE '%" + search + "%') AND ('%" + price + "%' is null OR item_price < " + price + ")

実際、これは削除されたテーブルです。最初のステートメントはおそらくエラーになり、次に 2 番目のステートメントが実行され、残りはコメントアウトされて実行されません。

于 2013-06-26T13:52:27.740 に答える