2017-08-02 43 views
0

我正在爲網站創建高級搜索功能,並且幾乎完成,我只有一個主要問題。 我匹配的房間是這樣的:MySQL - 如果輸入爲空,則返回所有值

AND Rooms=" .$_SESSION["room"] ." 

,並試圖以此爲好:

AND (Rooms=" .$_SESSION["room"] ." OR Rooms IS NULL) 

但問題是,如果用戶不插入在房間裏輸入任何值也不會顯示任何房間。如果我在房間輸入中插入「8」,如果沒有匹配,則使用IS NULL代碼,它將顯示來自數據庫的所有值。 我不想根據需要進行輸入。

我只是需要與MySQL的解決方案爲在該字段爲空返不使用這一切都值:

if ($_SESSION["room"]==NULL) {} 
else{} 

全面查詢:

`SELECT * FROM secret WHERE secretIDName='1' AND NatureTypeIDName LIKE '%" .$_SESSION["nature"] ."%' AND (NettArea>=" 
.$_SESSION["NettArea"] ." OR NettArea IS NULL) AND ConditionTypeIDName LIKE'%" .$_SESSION["lifestyle"] 
."%' AND ((SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1)>=" 
.$_SESSION["BusinessTypeValuesMin"] 
." AND SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1)<=" 
.$_SESSION["BusinessTypeValuesMax"] 
.") OR SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1) = '') AND (SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',2),'|',-1)='" 
.$_SESSION["BusinessTypeValuesType"] 
."' OR SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',2),'|',-1)='') AND GarageArea>=" 
.$_SESSION["GarageArea"] 
." AND (LocationIDName LIKE '%" 
.$_SESSION["zone1"] 
."%' AND LocationIDName LIKE '%" 
.$_SESSION["zone2"] 
."%' AND LocationIDName LIKE '%" 
.$_SESSION["zone3"] 
."%') AND (Rooms=" 
.$_SESSION["room"] 
.") LIMIT " 
.($page-1)*$Page 
.", " .$Page ."";` 
+0

發佈完整的查詢,請 –

+1

應用首先檢查'如果(空( '$ _ SESSION [ 「室」]')!){和房間=」 $ _ SESSION [ 「房間」]; 「} –

+0

如果$ _SESSION [」room「]爲空,請勿添加Rooms條件。 –

回答

0

在您的查詢,檢查NULL不是與檢查空白一樣。我想提出以下建議:

AND (Rooms=" .$_SESSION["room"] ." OR Rooms IS NULL OR Rooms <>'') 

另外,強烈建議過濾$_SESSION變量注入到這MySQL之前,如果它是一個數字,將其分配到$room=(int)$_SESSION['room'],迫使它是一個整數。

+0

感謝您的提示,代碼沒有工作,它沒有顯示數據 –

+0

它應該拋出一個空$ _SESSION ['room']的錯誤 - 你看不到錯誤是一個問題你的配置/進程 – symcbean

0

有幾種解決方案,其中之一就是將SQL存儲在字符串變量中,然後如果值不爲空,則添加房間條件。

$ SQL = SELECT ...

if ($_SESSION["room"] !== NULL) { $sql = $sql . ' AND Rooms=".$_SESSION["room"] . " ' }

+0

這正是我想要避免的 –

+0

然後你可以使用'CASE WHEN'子句...例如:'AND CASE WHEN $ _SESSION [「room」] <> NULL THEN Rooms = $ _ SESSION [ 「房間」] ELSE TRUE END' ....你只需要適應一下我猜 –

2

您可以創建這樣的條件(我假設,該 「房間」 是代表房間的數量是多少?):

AND (Rooms = ".(int)$_SESSION['room']." OR ".(int)$_SESSION['room']." = 0) 

如果$_SESSION['room']爲空(用戶沒有指定房間數量),您得到

AND (Rooms = 0 OR 0 = 0) 

...始終是TRUE,所以「房間」條件根本不適用。如果用戶指定的房間號,查詢看起來像:

AND (Rooms = 8 OR 8 = 0) 

8 = 0總是FALSE,如此有效,你的條件你需要:Rooms = 8

+0

數據庫中的數據被設置爲空,所以它會嘗試尋找0 = null這是錯誤的權利? –

+0

取決於你想如何處理數據庫中的NULL。如果用戶指定了8個房間,是否要包含'NULL'記錄?你可以用任何方式改變條件你想要的,比如'AND((Rooms ='。(int)$ rooms''OR Rooms IS NULL)OR'。(int)$ rooms。'= 0)'等。 –

+0

想要顯示空值,如果輸入爲空,如果插入任何值,我只想顯示該值 –

0

試試這樣的查詢:注意我用{}連接所有的php變量,而不是「。」。

SELECT * FROM secret WHERE secretIDName='1' AND NatureTypeIDName LIKE '%{$_SESSION["nature"]}%' AND (NettArea >={$_SESSION["NettArea"]} OR NettArea IS NULL) AND ConditionTypeIDName LIKE'%{$_SESSION["lifestyle"]}%' AND ((SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1)>={$_SESSION["BusinessTypeValuesMin"]} AND SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1)<={$_SESSION["BusinessTypeValuesMax"]}) OR SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',4),'|',-1) = '') AND (SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',2),'|',-1)='{$_SESSION["BusinessTypeValuesType"]}' OR SUBSTRING_INDEX(SUBSTRING_INDEX(BusinessTypeValues,'|',2),'|',-1)='') AND GarageArea>={$_SESSION["GarageArea"]} AND (LocationIDName LIKE '%{$_SESSION["zone1"]}%' AND LocationIDName LIKE '%{$_SESSION["zone2"]}%' AND LocationIDName LIKE '%{$_SESSION["zone3"]}%') AND (Rooms={$_SESSION["room"]}) LIMIT ($page-1)*$Page, $Page";

相關問題