2013-08-01 80 views
0

我有一個PHP方法,其中包含許多參數,所有參數都是可選的。 SQL查詢使用這些參數從員工數據庫中進行選擇,其中每個參數就像一個技能/角色。它看起來是這樣的:如何使用可選參數創建SQL SELECT查詢

getMedicalStaff($active = 1, $consultant = 0, $ana = 0, $outreach = 0, $prescribedBy = 0, $respiteCare = 0) 

什麼是創建一個SQL查詢來選擇從數據庫記住每個參數軸承排可能會或可能不會需要的最佳方式?我知道從理論上講這種方法是可能的,並且不要求任何東西,但實際上這是不太可能發生的。

我試過幾種不同的方法,但都沒有正常工作。我的第一次嘗試是這樣的:

// Build query 
$argActive = ($active == 1) ? 'true' : 'false'; 

SELECT * FROM MedStaff WHERE Active = $argActive 

但是,這顯然有缺陷,因爲它會要求某些字段顯式錯誤,當它們的值無關緊要時。

我想是構建SQL查詢,像這樣的下一件事:

$argActive = (active == 1) ? 'active = true' : ''; 

但後來我不得不招惹每個參數變量之間的空隙填充和不知道,如果一個參數變量實際上包含任何與否。

我也試過這樣:

$argActive = ($active == 1) ? '= true' : 'IS NULL'; 

$sql = "SELECT * FROM MedStaff WHERE Active $argActive 

問題是我不能保證數據庫字段,即使他們是「空」(我繼承了數據庫設計),明確是NULL所以這不似乎工作。

解決我的困境的最好方法是什麼?這感覺就像之前已經出現過很多次的問題,並且必須有一個標準的接受答案,但是我一直沒能找到一個在我的谷歌搜索中工作的問題。

+1

我看你已經接受一個答案,但不是讓所有這些參數,你也可以有一個參數這將是一個關聯數組。更簡單。 – Pablo

回答

1

使用條件的數組:

$wheres = array(); 
if ($active) { 
    $wheres[] = 'active = true'; 
} 
if ($consultant) 
    $wheres[] = 'consultant = true'; 
} 

然後用implode()將它們結合起來:

$where_string = implode(' AND ', $wheres); 

$sql = "SELECT * FROM MedStaff"; 
if ($where_string) { 
    $sql .= " WHERE " . $where_string; 
} 
+0

工程就像一個魅力,非常感謝! – Roy

相關問題