2012-11-03 67 views
10

Tôi đang cố tạo tùy chọn tìm kiếm/lọc trong ứng dụng hiến máu của mình. Nơi người hiến tặng có thể được tìm kiếm theo giới tính, tên, nhóm máu hoặc bằng cách chọn cả ba. Đây là mã của tôiLọc tìm kiếm bằng 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; 
    } 

Và đây là 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> 

Độc lọc hoạt động rất tốt. Nhưng để lọc với tất cả tôi đã sử dụng VÀ, nhưng nó mang lại cho tôi lỗi. Có ai giúp được không ?

Cảm ơn trước

+0

lỗi gì nó cung cấp cho bạn ...? – Menztrual

+0

Xin vui lòng ít nhất là thoát khỏi dữ liệu của bạn trong khi tìm kiếm trong cơ sở dữ liệu với 'mysql_real_escape_string ($ _ POST ['by_name']); 'Chúng tôi khuyên bạn nên sử dụng mysqli_ * hoặc PDO thay vì mysql_ * –

+0

Biến' $ donar' trong câu hỏi của bạn ? –

Trả lời

19

Giống như tất cả các bài đăng khác bạn sẽ cần phải nối thêm tất cả các điều kiện với AND như vậy. Đây là câu trả lời rõ ràng nhất. Hãy nhớ để thực sự thoát khỏi chuỗi của bạn mặc dù sử dụng mysqli OOP cách thay vì mysql cũ. Chỉ là một gợi ý.

Đây là ví dụ về truy vấn thông thường.

Cách đúng:

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

Cách bạn đang làm nó

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

Code:

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

Một trong những câu trả lời hay nhất và rõ ràng tôi đã thấy trên stackoverflow. Cảm ơn bạn rất nhiều @Rejinderi. –

+0

cảm ơn bạn @LaurenceNicolaou nhận xét của bạn đã đưa ra ngày của tôi: D – Rejinderi

0

Đoạn mã sau:

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

sản xuất các truy vấn như

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

, đó là không hợp lệ vì không có toán tử logic giữa các điều khoản. Bạn cần thêm 'AND'. Để đơn giản hóa mã, bạn có thể tạo điều kiện theo hình thức "true và 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

Hãy thử như thế này:

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

Có trong mã của bạn có vấn đề trong truy vấn nơi điều kiện. Tại đây, truy vấn của bạn sẽ giống như select * from donar where by_name = "A" by_group = "N" không có số And/Or để thực hiện điều kiện đúng. Hãy thử mã như được đưa ra dưới đây.

$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; 
} 

Ở đây trong mã Trước tiên, chúng tôi lấy $query_cond biến trống và tạo điều kiện theo mã. và quản lý AND nhà điều hành theo đó. Và cuối cùng, nếu chúng tôi tìm thấy $query_cond không trống thì hãy thêm nó vào $select_query.

Tôi hy vọng nó sẽ hữu ích cho bạn.

cảm ơn

0

Trong trường hợp này bạn không sử dụng xác thực, khuyên bạn không nên sử dụng Field là EMPTY hay NOT. Hãy thử mã dưới đây, Hy vọng nó sẽ hoạt động

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; 
} 
Các vấn đề liên quan