2012-12-12 53 views
0

我使用這個SQL語句來獲得行:爲什麼在傳遞「」時SQL語句返回所有行?

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

parameter得到的值形成一個文本框。文本框的默認值是" "

我的問題是我沒有在文本框中輸入任何內容時獲取所有行。我試圖用

WHERE lastname = 

這只是給我的一切,有" "

什麼是越來越排除在數據庫中的空白數據的正確途徑,也是不給你任何記錄的記錄時空白或「」作爲參數傳遞

+0

這裏使用參數來防止SQL注入。 –

+1

@EagleFox我給我的答案增加了一個重要的觀點。我希望這會有所幫助;-) – jbl

回答

1

首先,我希望你做一些消毒,以避免SQL注入。

然後你就可以在你的選擇:

  • 沒有,如果消毒參數包括裝飾(運行查詢)爲空
  • SELECT firstname, lastname FORM myTable WHERE ((lastname LIKE '" + parameter + "%') AND ''<>'" + parameter + "'"

第二個是從一個不好的做法一個表現點,它會假設你已經放棄了消毒(非常糟糕)

你也應該注意到,在你的消毒過程S,你將不得不逃離或刪除特殊字符_和%,見 http://msdn.microsoft.com/en-us/library/ms179859(v=sql.105).aspx

我你不解決這個問題,一個非空參數等於%會導致like '%%',這相當於like '%'

0

那麼你可以在你的代碼中測試參數變量的string.IsNullOrEmpty,這樣你甚至不需要進行數據庫調用。

在我看來,它是最有效率的事情。

+0

感謝您的快速回答,但未使用...但我使用的是啓動控制器的商店...並且每次我做更新時,我都會重新加載商店,所以如果我正在重新加載商店,這不會起作用。 – EagleFox

2

您使用的是wilcard,所以對於空搜索字符串,你最終

... WHERE lastname LIKE '%' 

將匹配一切。如果在搜索表單中沒有輸入任何內容,則只需在腳本級別檢測該內容,而不運行查詢,例如在PHP-ISH方面:

if (strlen($_GET['keywords']) == 0) { 
    die("No search terms entered"); 
} 
1
SELECT firstname, lastname 
FROM myTable 
WHERE lastname LIKE '" + parameter + "%' 
AND NULLIF(lastname,'') IS NOT NULL 
AND '" + parameter + "' <> '' 

很簡單隻返回其中姓氏startswith你的「參數」,只有其中「參數」不爲空字符串的記錄。

編輯:添加了代碼,要求它永遠不會以空白姓氏返回記錄。

+1

正如其他人所說,你可能只想不運行任何東西,如果你的參數是空的,並且不管你在一個SQL查詢中使用什麼都不是paramaterised(更多在這裏http://stackoverflow.com/questions/5468425/how -do-parameterized-queries-help-against-sql-injection),您必須確保安全以防止SQl注入。 – Treborbob

+0

謝謝Treborbob ...這正是我所做的......在我的控制器上,我檢查了傳遞的參數是否爲空......如果不是,那麼我執行該方法......非常感謝 – EagleFox

相關問題