2012-11-03 145 views
10

我正在尝试在我的献血者应用程序中创建搜索/筛选选项。捐献者可以通过性别,姓名,血型或全部三种方式进行搜索。这里是我的代码使用PHP/MySQL进行搜索筛选

function search_donar($_POST) { 

     $by_name = $_POST['by_name']; 
     $by_sex = $_POST['by_sex']; 
     $by_group = $_POST['by_group']; 
     $by_level = $_POST['by_level']; 

     $search_query = "SELECT * FROM donar WHERE"; 
     if($by_name !="") { 
      $search_query .= " name='$by_name'"; 
     } 
     if($by_sex !="") { 
      $search_query .= " sex='$by_sex'"; 
     } 
     if($by_group !="") { 
      $search_query .= " blood_group='$by_group'"; 
     } 
     if($by_level !="") { 
      $search_query .= " e_level='$by_level'"; 
     } 
     $search_query; 
     $result = mysql_query($search_query); 

     return $result; 
    } 

这里是HTML

if(isset($_POST['submit'])) { 

    $retrived_result = $donar->search_donar($_POST); 

} 

    <form action="" method="post"> 
    <table width="100%" border="0" style="border:none;"> 
     <tr> 
     <td><label>Name:&nbsp;</label><input type="text" name="by_name" /></td> 
     <td><label>Sex:&nbsp;</label><input type="text" name="by_sex" /></td> 
     <td><label>Blood Group:&nbsp;</label><input type="text" name="by_group" /></td> 
     <td><label>Level:&nbsp;</label><input type="text" name="by_level" /></td> 
     <td><input class="button" type="submit" name="submit" value="Search" /></td> 
     </tr> 
    </table> 
    </form> 

单过滤功能非常精细。但要过滤所有我使用的AND,但它给了我错误。谁能帮忙?

预先感谢

+0

什么错误它给你......? – Menztrual

+0

请至少使用'mysql_real_escape_string($ _ POST ['by_name'])在数据库中搜索时跳过您的数据;'强烈建议使用mysqli_ *或PDO代替mysql_ * –

+0

什么是您的问题中的$ donar变量? –

回答

19

像所有其他职位,你将需要附加所有的条件与像这样。迄今为止,这是最清洁的答案。请记住要使用mysqli OOP方式而不是旧的mysql来真正地逃脱你的字符串。只是一个建议。

下面是一个典型查询的例子。

正确的方法:

SELECT * FROM donar WHERE name='dxenaretionx' AND sex='M'; 

你正在做它的方式

SELECT * FROM donar WHERE name='dxenaretionx' sex='M'; 

代码:

function search_donar($_POST) { 
    $by_name = $_POST['by_name']; 
    $by_sex = $_POST['by_sex']; 
    $by_group = $_POST['by_group']; 
    $by_level = $_POST['by_level']; 

    //Do real escaping here 

    $query = "SELECT * FROM donar"; 
    $conditions = array(); 

    if(! empty($by_name)) { 
     $conditions[] = "name='$by_name'"; 
    } 
    if(! empty($by_sex)) { 
     $conditions[] = "sex='$by_sex'"; 
    } 
    if(! empty($by_group)) { 
     $conditions[] = "blood_group='$by_group'"; 
    } 
    if(! empty($by_level)) { 
     $conditions[] = "e_level='$by_level'"; 
    } 

    $sql = $query; 
    if (count($conditions) > 0) { 
     $sql .= " WHERE " . implode(' AND ', $conditions); 
    } 

    $result = mysql_query($sql); 

    return $result; 
} 
+1

我在stackoverflow上看到的最好和明确的答案之一。非常感谢@Rejinderi。 –

+0

谢谢@LaurenceNicolaou您对我的日子的评论:D – Rejinderi

0

下面的代码片断:

$search_query = "SELECT * FROM donar WHERE"; 
if($by_name !="") { 
    $search_query .= " name='$by_name'"; 
} 
if($by_sex !="") { 
    $search_query .= " sex='$by_sex'"; 
} 

产生查询,如

SELECT * FROM donar WHERE name='nowak' sex='m' 

,因为在条款之间没有逻辑运算符,它是无效的。你需要添加一个'AND'。为了简化代码,你可以在形式产生条件“真正的A和B ...”:

$search_query = "SELECT * FROM donar WHERE true"; 
if($by_name !="") { 
    $search_query .= " AND name='$by_name'"; 
} 
if($by_sex !="") { 
    $search_query .= " AND sex='$by_sex'"; 
} 
... 
0

尝试这样的:

function search_donar($_POST) { 

     $by_name = $_POST['by_name']; 
     $by_sex = $_POST['by_sex']; 
     $by_group = $_POST['by_group']; 
     $by_level = $_POST['by_level']; 

     $isfirst=0; 
     $search_query = "SELECT * FROM donar WHERE"; 
     if($by_name !="") { 

      $search_query .= " name='$by_name'"; 
      $isfirst=1; 
     } 
     if($by_sex !="") { 
      if($isfirst!=0) 
      $search_query .= " AND "; 
      $search_query .= " sex='$by_sex'"; 
      $isfirst=1; 
     } 
     if($by_group !="") { 
      if($isfirst!=0) 
      $search_query .= " AND "; 
      $search_query .= " blood_group='$by_group'"; 
      $isfirst=1; 
     } 
     if($by_level !="") { 
      if($isfirst!=0) 
      $search_query .= " AND "; 
      $search_query .= " e_level='$by_level'"; 
      $isfirst=1; 
     } 
     $result = mysql_query($search_query); 

     return $result; 
    } 
1
在你的代码

有没有问题查询条件。在这里您的查询将会像 select * from donar where by_name = "A" by_group = "N"那里有And/Or,以使条件适当。请尝试下面给出的代码。

$search_query = "SELECT * FROM donar"; 
$query_cond = ""; 

if($by_name !="") { 
     $query_cond .= " name='$by_name'"; 
} 
if($by_sex !="") { 

     if(!empty($query_cond)){ 
      $query_cond .= " AND "; 
     } 

     $query_cond .= " sex='$by_sex'"; 
} 

if($by_group !="") { 

     if(!empty($query_cond)){ 
      $query_cond .= " AND "; 
     } 

     $query_cond .= " blood_group='$by_group'"; 
} 

if($by_level !="") { 

     if(!empty($query_cond)){ 
      $query_cond .= " OR "; 
     } 

     $query_cond .= " e_level='$by_level'"; 
} 

if(!empty($query_cond)){ 
     $query_cond = " Where ".$query_cond; 
     $search_query.$query_cond; 
} 

在这里,代码首先,我们需要$query_cond变空,并根据代码作出条件。据此管理AND运营商。并在最后如果我们发现$query_cond不空,然后将其添加到$select_query

我希望这会对你有所帮助。

感谢

0

在这个地方,你不使用验证,它recomended不使用字段是否为空。尝试下面的代码,希望它会工作

function search_donar($_POST) { 

    $by_name = $_POST['by_name']; 
    $by_sex = $_POST['by_sex']; 
    $by_group = $_POST['by_group']; 
    $by_level = $_POST['by_level']; 

    $search_query = "SELECT * FROM donar WHERE name LIKE '%$by_name%' AND sex LIKE '%$by_sex%' AND blood_group LIKE '%$by_group%' AND e_level LIKE '%$by_level%' "; 

    $result = mysql_query($search_query); 

    return $result; 
}