2010-10-25 46 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