2014-01-14 91 views
1

我想建立一個免費的婚姻網站,其中的主頁擁有一個簡單的窗體,一些文本框&下拉菜單和一個搜索按鈕。高級搜索查詢

點擊後,它將訪問者帶到另一個頁面以及所有字段的查詢字符串。

我用下面的存儲過程來顯示搜索結果。

ALTER PROCEDURE dbo.homesearch 
@gender varchar(6), 
@age int, 
@age2 int, 
@religion varchar(50), 
@status varchar(11), 
@resCountry varchar(50), 
@resCity varchar(50) 
AS 
SELECT * 
    FROM [users] 
    WHERE 
     (([age] > @age) OR ([age] < @age2) OR 
     ([gender] = @gender) OR ([religion] = @religion) OR 
     ([status] = @status) OR ([resCountry] = @resCountry) OR 
     ([resCity] = @resCity)) 

RETURN 

的問題是我堅持或&和

如果我用OR它就會出現很多不相關的結果。

如果我使用AND那麼如果任何搜索查詢是空的。

對不起,我是新手,我的問題可能對您的朋友太幼稚。

另一個問題,如果它的最好的&安全的方式來做到這一點?如果不是,那我該如何改進呢?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

這樣的基本思路是參數可能爲空或可能不會,所以使得這樣的查詢

ALTER PROCEDURE dbo.homesearch 
@gender varchar(6), 
@age int, 
@age2 int, 
@religion varchar(50), 
@status varchar(11), 
@resCountry varchar(50), 
@resCity varchar(50) 

AS 
SELECT * FROM [users] 
WHERE (@gender is null or gender = @gender) 
AND ((@age is null or age > @age) 
AND (@age2 is null or age <@age2)) 
AND (@religion is null or [email protected]) 
AND (@status is null or status [email protected]) 
AND (@resCountry is null or resCountry [email protected]) 
AND (@resCity is null or resCity [email protected]) 
RETURN 
1

你使用的參數,如果isNull您使用and ...

SELECT * FROM [users] 
WHERE (([age] > isNull(@age, [age]) 
AND ([age] < isNull(@age2, [age]) 
AND ([gender] = isNull(@gender, [gender]) 
AND ([religion] = isNull(@religion, [relegion]) 
AND ([status] = isNull(@status,[status]) 
AND ([resCountry] = isNull(@resCountry, [resCountry]) 
AND ([resCity] = isNull(@resCity, [resCity])) 

這裏是isNull一些閱讀,它是有用的兄弟Coalesce。當null = null的計算結果爲false時,如果數據中有空值,合併可能會派上用場。請參閱:Why does NULL = NULL evaluate to false in SQL server。作爲一個例子,我們將假設religion在數據庫中可以具有空值。

SELECT * FROM [users] 
WHERE (isNull([religion],'N/A') = Coalesce(@religion, [relegion], 'N/A') 
... etc 

我可能不會在現實世界中使用N/A,你可以使用一個空字符串,整數,任何你喜歡的,只要它是平等測試的兩側是相同的。

在附註中,我會使用<=>=進行年齡測試。

0

這取決於你想要什麼。

之間&或以任何編程語言如TSQL的區別是:

當您使用OR條件之間 (像:​​ 這意味着如果連有一個條件是真的,這樣做(SELECT * FROM users)

但是,當您使用AND條件 之間(像:([age] > @age) AND ([age] < @age2) AND ([gender] = @gender) AND ([religion] = @religion)) 意味着,如果我的所有條件爲真,爲此(SELECT * FROM users)

所以如果你想讓結果包含具有所有條件的用戶,請使用AND。 但是,如果您希望結果包含甚至具有其中一個條件(或更多)的用戶,請使用OR。

0

使用存儲過程是最好的實踐和查詢數據安全的方法之一。您也可以使用「動態SQL」來添加更多高級搜索功能,但這不是最佳做法,並且很容易出現Sql注入攻擊。