2011-02-18 70 views
-1

我正在做一個MySQL查詢來搜索數據庫中的項目。我已經將變量從搜索表單中提取出來,但是我的WHERE子句出現了一些問題。因爲我不想搜索未在表單中輸入的字段。我在一分鐘的代碼是:PHP MySQL計數器/循環查詢

$query = " SELECT RequestID, clients.ClientName, clients.Username, RequestAssignee, requests.StatusID, requests.PriorityID, StatusName, PriorityName 
            FROM requests 
            INNER JOIN clients ON requests.ClientID = clients.ClientID 
            INNER JOIN statuses ON requests.StatusID = statuses.StatusID 
            INNER JOIN priorities ON requests.PriorityID = priorities.PriorityID 
            WHERE "; 
            if(!empty($RequestID)) 
            { 
             $query2 .= "RequestID = '" . $RequestID . "' OR "; 
            } 
            if(!empty($ClientName)) 
            { 
             $query2 .= "clients.ClientName = '" . $ClientName ."' OR "; 
            } 
            if(!empty($Username)) 
            { 
             $query2 .= "clients.Username = '" . $Username . "' OR "; 
            } 
            if(!empty($RequestAssignee)) 
            { 
             $query2 .= "RequestAssignee = '" . $RequestAssignee . "' OR "; 
            } 
            if(!empty($Status)) 
            { 
             $query2 .= "statuses.StatusName = '" . $Status ."' OR "; 
            } 
            if(!empty($Priority)) 
            { 
             $query2 .= "priorities.PriorityName = '" . $Priority ."'"; 
            } 

但是你可以看到一個問題,即如果有人只搜索一個字段,查詢增加了一個「OR」進行到底,從而導致錯誤:

SELECT RequestID, clients.ClientName, clients.Username, RequestAssignee, requests.StatusID, requests.PriorityID, StatusName, PriorityName FROM requests INNER JOIN clients ON requests.ClientID = clients.ClientID INNER JOIN statuses ON requests.StatusID = statuses.StatusID INNER JOIN priorities ON requests.PriorityID = priorities.PriorityID WHERE RequestID = '3' OR 

林猜測我將不得不把某種循環或計數器,但不確定如何接近它。有任何想法嗎?

謝謝,馬特。

+1

這正是我在前面提到的問題中提到的問題。但你當然是最聰明的人,不需要任何建議 – 2011-02-18 12:36:25

回答

2
$parts = array(); 
if(!empty($RequestID)) 
{ 
    $parts[] = "RequestID = '" . $RequestID . "' "; 
} 
if(!empty($ClientName)) 
{ 
    $parts[] = "clients.ClientName = '" . $ClientName ."' "; 
} 
if(!empty($Username)) 
{ 
    $parts[] = "clients.Username = '" . $Username . "' "; 
} 
if(!empty($RequestAssignee)) 
{ 
    $parts[] = "RequestAssignee = '" . $RequestAssignee . "' "; 
} 
if(!empty($Status)) 
{ 
    $parts[] = "statuses.StatusName = '" . $Status ."' "; 
} 
if(!empty($Priority)) 
{ 
    $parts[] = "priorities.PriorityName = '" . $Priority ."' "; 
} 

$query2 .= implode(' OR ', $parts); 
+0

這就是我正在得到的 - 但要求提問者走開並首先發揮:-) +1都是一樣的。 – diagonalbatman 2011-02-18 12:40:32

1

行,所以我會接近這個辦法是建立將成爲您的where子句separatley變量:

這可以在陣列中完成:

FIELD1=>'Value1'; 
FIELD2=>'Value2'; 

然後,我會遍歷這個數組,對於第一個元素,i = 1我將在WHERE中構建,對於i + n - > i +(n-1),我會預先給出一個OR,對於最後一個數組我不會做任何事情。

然後我可以使用我在這個循環中構建的字符串 - 來堅持我的查詢字符串。

如果您需要更多的幫助,請大聲點兒,給我們留言。這樣做也稍微可維護。