2012-11-03 13 views
10

Próbuję utworzyć opcję wyszukiwania/filtrowania w mojej aplikacji dawcy krwi. Gdzie dawca może być przeszukiwany według płci, nazwiska, grupy krwi lub wybierając wszystkie trzy. Oto mój kodFiltrowanie wyszukiwania za pomocą 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; 
    } 

A oto 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> 

pojedyncze filtrowanie działa bardzo dobrze. Ale żeby filtrować ze wszystkim, czego użyłem AND, ale daje mi błąd. Czy ktoś może pomóc?

góry dzięki

+0

Jaki błąd to dać ...? – Menztrual

+0

Proszę przynajmniej uciec przed danymi podczas wyszukiwania w bazie danych za pomocą 'mysql_real_escape_string ($ _ POST ['by_name']);' Zdecydowanie zaleca się używanie mysqli_ * lub PDO zamiast mysql_ * –

+0

Co to jest zmienna '$ donar' w pytaniu ? –

Odpowiedz

19

jak wszystkie inne postu trzeba będzie dołączyć wszystkie warunki z I jak tak. To najczystsza odpowiedź do tej pory. Pamiętaj, aby naprawdę wymknąć się strunom, ale użyj mysqli OOP zamiast starego mysql. Tylko sugestia.

Oto przykład typowego zapytania.

Prawidłowy sposób:

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

Sposób, w jaki to robią

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

Kod:

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

Jedna z najlepszych i wyraźnych odpowiedzi, jakie widziałem na stackoverflow. Dziękuję bardzo @Rejinderi. –

+0

dziękuję @LaurenceNicolaou twój komentarz zrobił mój dzień: D – Rejinderi

0

Poniższy fragment kodu:

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

produkuje zapytań jak

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

, które nie są ważne, ponieważ nie ma żadnego logicznego operatora między klauzulami. Musisz dodać "AND". Aby uprościć kod, można wygenerować warunki w postaci „true oraz A i 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

Spróbuj tak:

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

tam Twój kod nie jest problemem w zapytaniu gdzie stan. Tutaj zapytanie będzie takie jak select * from donar where by_name = "A" by_group = "N" pod numerem And/Or. Spróbuj kodu podobnego do podanego poniżej.

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

Tutaj w kodzie Najpierw bierzemy $query_cond zmienna pusta i uczynić stan według kodu. i zarządzaj operatorem AND zgodnie z tym. I na koniec, jeśli stwierdziliśmy, że $query_cond nie jest pusty, dodaj go do $select_query.

Mam nadzieję, że będzie to pomocne.

dzięki

0

W ten gdzie nie używać poprawności, zalecane jest, aby nie używać, czy pole to jest puste, czy nie. Spróbuj poniżej kod, nadzieja będzie działać

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; 
} 
Powiązane problemy