2015-01-13 114 views
0

我有一個這樣的日子,MySQLi編寫條件語句

我有四個可能的變量,只有其中一個是必需的。我的問題是,如果有可能顯示或不顯示的部分查詢,我該如何準備一個語句/構造sql查詢。

這樣的事情,我想:

sql = "SELECT * FROM dogs WHERE name = ?" 
if(isset($dogid)) { 
sql .= "AND WHERE id = ?"; 
} 

} 
if(isset($dogcolour)) { 
sql .= "AND WHERE colour = ?"; 
} 

我的大腦完全打破了,我想,必須有一個更好的方法比使用類似$ dogID =「true」以做準備;在每個if中,然後用一堆if語句綁定它。

MySQL顯然有辦法處理這個,我只是不記得那是什麼。

謝謝。

+0

留出空間,它出來'WHERE name ='blah'AND..'但並沒有什麼錯有條件構建查詢 – Mihai

+0

嚴,我不認爲有一個問題與建設它,但我認爲必須比做$ bind_params。=「s」,$ bind_params。=「i」;等等,以及$ bind_vars。='$ id'; $ bind_vars。=「$ color」等全部在不同的if(){}中 - –

+0

如果你正在用低級別的'mysqli'抨擊,這是實現它的方法。您可以通過在數組中組合條件來簡化它,然後在最後一步使用「AND」將它們連接在一起。更好的方法是使用像[Laravel](http://laravel.com/)這樣的[開發框架](http://codegeekz.com/best-php-frameworks-for-developers/)具有強大的ORM,簡化了描述過濾器的方法。 – tadman

回答

1

那麼我會定義一些空值,然後檢查數據庫中的所有內容。

$sql = "SELECT * FROM dogs WHERE (IF(? = 0, 1 = 1, name = ?)) AND (IF(? = 0, 1 = 1, colour = ?))" 

這個解決方案有一個缺點,你需要傳遞所有參數兩次:

$statement->bind_param('ssss', $name, $name, $colour, $colour); 

如果名稱或$顏色變量是0,那麼1 = 1是在陳述(巫女始終是真實的)執行。應該有可能性將NULL值傳遞給mysqli,但是對於我來說它不起作用,如果它工作的話可以簡化查詢。在與運算之前

$sql = "SELECT * FROM dogs WHERE name = (IFNULL(?, name)) AND colour = (IFNULL(?, colour))" 
+0

這是一個聰明的做法,但可能太聰明瞭一半。我注意到,由於條件的動態特性,可以正確使用索引,因此可能需要非常昂貴的表掃描。 – tadman