2010-10-25 56 views
0

親愛的專家, 讓我說我必須搜索3個相關的選項1)姓名2)地址3)電話。所以,我必須寫8 [八]個單獨queries.pls看下面的例子...。如何使用PHP編寫動態查詢凝視使用PHP

$name= $_POST['name'];  
    $address = $_POST['address']; 
    $phone= $_POST['phone']; 
    if($name!=""&& $address==""&& $phone=="") 
{ $searching_query="SELECT id,name,address from info where info LIKE '%$info%'";}   
    .....................................  
    ...................................... 
    .......................................... 
    else if($name!=""&&$address==""&&$phone!="") 
{ $searching_query="SELECT id,name,address from info where name LIKE '%$ name%' AND phone LIKE '$phone' "; } 
    else if ($name!=""&&$address!=""&&$phone!="") 
{ $searching_query="SELECT id,name,address from info where name LIKE '%$ name%' AND address LIKE '%$address%' AND phone LIKE '$phone' ";} 

因此,如果相關搜索選項多於那個,那麼我必須編寫越來越多的查詢。

現在我的問題是:我該如何動態地寫出確切的查詢。我的意思是查詢的WHERE子句將根據發佈的值生成。

請幫忙! Thx,riad

+1

*(旁註)*爲了防止SQL注入,您應該首先通過'filter_input'運行值,並考慮使用預處理語句而不是字符串連接查詢。 – Gordon 2010-10-25 08:47:06

回答

1

您可以使用分隔符將「數組條目」連接到字符串。如果在這種情況下,你就可以用「AND」作爲分隔符,你可以得到幫助:

$like_clauses = array(); 

$fields = array("phone", "address", "name") ; 

foreach($fields as $field) { 
    if(!array_key_exist($field, $_POST)) continue; 

    $like_clauses[$field]= 
    $field." LIKE '%" 
    // thanx to @darko petreski's comment: 
    .mysql_real_escape_string($_POST[$field]) 
    ."%'"; 

} 

$query = "SELECT id,name,address from info where " 
     .implode("AND", $like_clauses); 

(注:未經檢驗的 - 搶的想法)

編輯 - 添加mysql_real_escape_string避免注入漏洞

+0

謝謝xtofl,是它的工作,但需要一個小的修改。 $ like_clauses [$ field] = $ field。「LIKE」。「'%」。$ _ POST [$ field]。「%'」;} – riad 2010-10-25 09:08:35

+0

不錯的代碼。現在大家都知道你的代碼不受sql注入攻擊的保護。 – darpet 2010-10-25 09:34:33

+0

@darko petreski:幸運的是,我不經常做數據庫:)我會糾正這一點。 – xtofl 2010-10-25 11:07:40

2

使用數組!並使用供應商特定的功能逃避用戶輸入以防止SQL注入。在這種情況下應該使用mysql_real_esacpe_string()。

$where = array(); 
foreach(array('name','address','phone') as $key) { 
    if(isset($_POST[$key]) && !empty($_POST[$key])) { 
     $where[] = $key . " LIKE '%" . mysql_real_escape_string($_POST[$key]) . "%'"; 
    } 
} 
$query = "SELECT id,name,address FROM info"; 
if(empty($where)) { 
    $query .= "WHERE info LIKE '%" . mysql_real_escape_string($info) . "%'"; 
} else { 
    $query .= "WHERE " . implode(' AND ',$where); 
} 
+0

不應該是'$ _POST [$ key]'? – Shikiryu 2010-10-25 09:05:08

+0

感謝兄弟...非常感謝 – riad 2010-10-25 09:11:37

+0

@Chouchenous正確,錯字 – 2010-10-25 09:20:30