2014-02-10 38 views
0

我需要設置一個SQL查詢,其中包含從URL中提取的多個參數。到目前爲止,我只能讓它與URL中只有一個項目一起工作。設置具有多個參數的SQL查詢

我的默認查詢到的所有內容

$sql = "SELECT "; 
$sql .= "* "; 
$sql .= "FROM "; 
$sql .= "cms_site_content "; 
$sql .= "WHERE "; 
$sql .= "1"; 

拉然後我檢查什麼是通過URL傳遞和檢索。

if (isset($_GET["d"])) { 
$d=$_GET["d"]; 

裏面的if語句,我發現如「d」傳遞的價值觀爲單獨項目

$newD = explode(',',$d); 
$countD = count($newD); 


foreach($newD as $discipline) { 

if ($countD == 1) { 
      $sql .= " AND"; 
    $sql .= " discipline='".$discipline."'"; 
} 

我的問題是獲得SQL工作,如果有一個以上的學科價值。它應是這樣的:

SELECT * FROM cms_site_content WHERE 1 AND discipline="value" 

但是如果有一個以上的學科價值,應改爲:

SELECT * FROM cms_site_content WHERE 1 AND discipline="value OR discipline="value2" OR discipline="value3" 

有沒有寫這個更有效的方式?我無法弄清楚如何將OR插入到foreach語句中。

+0

有很大的庫和框架在那裏,做這一切都爲您包括安全,爲什麼另起爐竈? – jtheman

+0

你應該閱讀如何使用帶有MySQL的PDO:http://www.php.n et/manual/en/pdo.prepare.php – sdespont

+0

你可以使用圓括號來做'塊'檢查('SELECT * FROM cms_site_content WHERE 1 AND(discipline =「value」OR discipline =「value2」)')。我建議刪除'1 AND'塊以使其更容易,甚至可以使用爲您完成工作的框架/庫。 – Diamondo25

回答

2

保存在陣列中的所有學科值;

$discipline_arr = array(); 
foreach($newD as $discipline) { 

    $discipline_arr[] = $discipline; 
    // by the way, don't forget to escape for sql injection 
    // mysql_escape_string is the depracated one, u can use that if u have no 
    // other choice 


} 
在SQL

然後,他們添加爲學科(「值1」,「值」,「等等」)條件(即字符串,數值類型它會像紀律( 1,2,3,4等)

$sql = " SELECT * FROM cms_site_content WHERE 1 " . 
    (empty($discipline_arr) ? "" : "and 
     discipline in ('". implode("','" , $discipline_arr). "') ") ; 

鏈接逃逸 http://tr1.php.net/manual/en/function.mysql-escape-string.php

+0

+1,幹得好,我更喜歡你的回覆。不知道你可以像這樣使用in()。 – AnchovyLegend

+0

謝謝。順便說一下,我在你的個人資料中看到了這樣的情況:「世界上有10種人,那些懂二進制的人,那些不懂的人。」非常聰明 – Nihat

1

假設您的查詢的其餘部分是完整的。只要您所有的紀律值存儲在數組中,如下所示,然後喂$discipline_string$sql查詢:

$discipline_ary = array('option1', 'option2', 'option3'); 
$discipline_string = ""; 

for($i=0; $i < count($discipline_ary); $i++){ 
    $discipline_string .= " discipline = '" . $discipline[$i] . "' "; 

    if($i+1 == count($discipline_ary)){ 
     break; 
    }else{ 
     $discipline_string .= " OR " 
    } 
}