尊敬的专家, 假设我必须搜索3个共同相关的选项1)名称2)地址3)电话。所以,我必须编写8 [8]个单独的查询。请参阅下面的示例...。
$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,里亚德
答案 0 :(得分: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);
}
答案 1 :(得分: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
以避免注入漏洞