1

最大 3 つのコマンド ライン引数を MySQL クエリに渡すスクリプトがあります。照会しているテーブルは、プロのスポーツ選手と彼らがプレーするスポーツのリストです。コマンド ラインでの私の引数は、-s (スポーツの場合) -i (整数の場合)、および -l (文字の場合) に設定されています。

-s は直接文字列検索 (つまり、'Hockey' はスポーツの下にリストされている 'Hockey' を持つプレーヤーを返します) であり、-i は整数であり、検索は名前が以下の文字数のプレーヤーを返すことになっています。 my integer、-l は文字で、名前が a と '-l' の間の文字で始まるプレーヤーが検索で返されます。

現在、私の検索は次のとおりです。

"Select * from Players_Sport where Sport like '$lsport_search' AND length(Player)<='$linteger_search' AND Player between 'a%' and '$lletter_search%'"

現在、これは整数と文字の引数が空白でない場合に機能しますが、スポーツ フィールドが空白の場合にも機能します。それが機能しない理由を理解しています (length(Player) < null および a% と null の間の Player をチェックしています)。可能なすべての反復の条件を書かずに動作させるためにできることはありますか?

4

1 に答える 1

1

まず、テーブルの Player および Sport 列を NULL にしないでください。設定した方法でスポーツのないプレーヤーを使用するのは意味がありません。CREATE TABLE では、これらのフィールドを必ず NOT NULL に設定してください。

第二に、あなたのプログラムは常に -s、-i、および -l を必要としますか? その場合は、次のようにクエリを記述します

SELECT * FROM Players_Sport
WHERE
Sport = '$lsport_search'
AND LEN(Player) <= '$linteger_search'
AND Player BETWEEN 'A' AND '$lletter_search'

-s、-i、および -l がすべて存在しない場合は、必要なオプションのみを使用してクエリを作成します。また、さまざまな種類の LEN、OR、CASE などを使用できますが、見苦しくなります。

SELECT * FROM Players_Sport
WHERE
(Sport = '$lsport_search' OR LEN('$lsport_search') = 0)
AND (LEN(Player) <= '$linteger_search' OR LEN('$linteger_search') = 0)
AND (Player BETWEEN 'A' AND '$lletter_search' OR LEN('$lletter_search') = 0)

最後になりましたが、他の人が言ったように、最終的には $lsport_search のようなものが特殊文字でいっぱいにならないように注意する必要があります. いたずら好きな人は、弦の真ん中に「'」を挿入し、いたずらの門を開くことがあります。

于 2013-05-16T05:51:56.407 に答える