2012-11-03 11 views
10

Ich versuche eine Such-/Filteroption in meiner Blutspendeanwendung zu erstellen. Wo Spender nach Geschlecht, Name, Blutgruppe oder durch Auswahl aller drei gesucht werden kann. Hier ist mein CodeSuche Filterung mit 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; 
    } 

Und hier ist der 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> 

Einzel Filterung funktioniert sehr gut. Aber mit allem, was ich UND verwendet, zu filtern, aber es gibt mir einen Fehler. Kann jemand helfen ?

Vielen Dank im Voraus

+0

Welche Fehler es Ihnen nicht geben ...? – Menztrual

+0

Bitte entschlüsseln Sie zumindest Ihre Daten während der Suche in der Datenbank mit mysql_real_escape_string ($ _ POST ['by_name']); 'Es wird dringend empfohlen, mysqli_ * oder PDO anstelle von mysql_ * –

+0

Was ist' $ Donar' Variable in Ihrer Frage ? –

Antwort

19

Wie alle anderen Beitrag müssen Sie alle Bedingungen mit AND so anfügen. Dies ist die bisher sauberste Antwort. Denken Sie daran, Ihre Strings tatsächlich zu entschlüsseln, indem Sie die mysqli OOP-Methode anstelle der alten mysql verwenden. Nur ein Vorschlag.

Hier ist ein Beispiel für eine typische Abfrage.

Der richtige Weg:

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

Die Art und Weise Sie es tun

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

Eine der besten und klarsten Antworten, die ich auf Stackoverflow gesehen habe. Vielen Dank @Rejinderi. –

+0

danke @LaurenceNicolaou Ihr Kommentar machte meinen Tag: D – Rejinderi

0

Snippet folgenden Code:

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

Anfragen wie

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

, die nicht gültig sind, weil es keine logische Verknüpfung zwischen den Klauseln ist. Sie müssen ein 'UND' hinzufügen. Um Code zu vereinfachen, können Sie Bedingungen in Form erzeugen "wahr und a und 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

Versuchen wie folgt aus:

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

Es in Ihrem Code gibt es Problem in Abfrage wo Bedingung. Hier ist Ihre Abfrage wie select * from donar where by_name = "A" by_group = "N" gibt es keine And/Or, wo Zustand richtig zu machen. Bitte versuchen Sie es mit dem unten angegebenen Code.

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

Hier in Code Zuerst nehmen wir $query_cond Variable leer und Bedingungscode entsprechend machen. und verwalten AND Operator entsprechend. Und wenn wir zuletzt $query_cond nicht leer fanden, fügen Sie es zu $select_query hinzu.

Ich hoffe, es wird für Sie hilfreich sein.

dank

0

In diesem, wo man nicht verwenden keine Validierung verwendet, ist es empfehlenswert, ob Feld leer ist oder nicht. Versuchen Sie unter dem Code, hoffe, es wird funktionieren