0

次の SQL ステートメントを使用して行を取得しています。

SELECT firstname, lastname 
FROM myTable 
WHERE ((lastname LIKE '" + parameter + "%')

parameterテキストボックスから値を取得します。テキストボックスのデフォルト値は" "

私の問題は、テキストボックスに何も入力されていないときにすべての行を取得していることです。使ってみた

WHERE lastname = 

これは単に私に持っているすべてのレコードを与えます" "

データベース内の空白を除外し、空白または " " がパラメーターとして渡されたときにレコードを取得しないデータを取得する正しい方法は何ですか?

4

4 に答える 4

2

ワイルドカードを使用しているため、空白の検索文字列の場合、最終的には

... WHERE lastname LIKE '%'

これはすべてに一致します。検索フォームに何も入力されていない場合は、スクリプト レベルでそれを検出し、クエリを実行しないようにする必要があります。

if (strlen($_GET['keywords']) == 0) {
   die("No search terms entered");
}
于 2012-12-12T17:13:02.863 に答える
1
SELECT firstname, lastname
FROM myTable
WHERE lastname LIKE '" + parameter + "%'
AND NULLIF(lastname,'') IS NOT NULL
AND '" + parameter + "' <> ''

単純に、lastname が「parameter」で始まり、「parameter」が空の文字列ではないレコードのみを返します。

編集:姓が空白のレコードを返さないという要件のコードを追加しました。

于 2012-12-12T17:13:49.250 に答える
1

まず、SQL インジェクションを避けるためにサニタイズを行っていただきたいと思います。

次に、お好みで次のことができます。

  • trim() を含むサニタイズ パラメータが空の場合、クエリを実行しない
  • 持ってるSELECT firstname, lastname FORM myTable WHERE ((lastname LIKE '" + parameter + "%') AND ''<>'" + parameter + "'"

2 つ目はパフォーマンスの点で悪い習慣であり、サニタイズをあきらめたと仮定します (非常に悪い)。

また、サニタイズ プロセスでは、特殊文字 _ と % をエスケープまたは削除する必要があることに注意して ください。 aspx

これを処理しないと、 % に等しい空でないパラメーターは につながりますlike '%%'。これは次と同等ですlike '%'

于 2012-12-12T17:15:06.440 に答える
0

コード内のパラメーター変数で string.IsNullOrEmpty をテストするだけでよいので、データベース呼び出しを行う必要さえありません。

私の見解では、それが最も効率的なことです。

于 2012-12-12T17:11:37.093 に答える