2016-03-31 9 views
0

Ich habe eine Benutzerseite, auf der standardmäßig alle Benutzer im System angezeigt werden.Verfeinern von PHP-Variablen basierend auf if-Bedingungen

Ich versuche, Filter anzuwenden, damit Benutzer ihre Suche nach einem Benutzer verfeinern können. Zeigen Sie beispielsweise alle Benutzer an, die männlich sind.

standardmäßig für alle Benutzer users.php anzuzeigen, ich bin diese Abfrage standardmäßig ausgeführt wird:

$get_all_users = "SELECT * FROM users"; 

Aber wenn ein Benutzer zum Beispiel ausgewählt sie alle weiblichen Benutzer auf dem System anzeigen möchten, dann möchte ich diese Abfrage (Beispiel) auszuführen:

$get_all_users = "SELECT * FROM users WHERE gender = 'female'"; 

Aber aus irgendeinem Grund, die Abfrage, die alle Benutzer standardmäßig angezeigt wird, wird immer dann ausgeführt wird. Hier ist mein Ansatz:

// get gender from radio buttons 
$refined_gender = htmlentities (strip_tags(@$_POST['gender'])); 

$get_all_users = "SELECT * FROM users"; 

if (isset($_POST['submit'])){ 
if (isset($_POST['gender'])) { 
     if ($refined_gender){ 
       $get_all_users = "SELECT * FROM users WHERE gender = '$refined_gender'"; 
     } 
    } 
} 
+1

1. Haben Sie verifiziert ('var_dump ($ _ POST)'), dass diese beiden Elemente tatsächlich gesetzt sind? 2. Dies ist wahrscheinlich nicht der Grund, warum es zu diesem Zeitpunkt nicht funktioniert, aber "htmlentities" und "strip_tags" sind nicht geeignet, um Eingaben in eine SQL-Abfrage zu umgehen. –

+0

Der Grund, warum Sie '@ $ _ POST ['gender'] 'tun, ist wegen der lästigen Warnung, die Sie gewarnt hat, dass dieser Schlüssel im POST-Array nicht existiert. Warum also nicht vorher prüfen, ob die WHERE-Klausel irgendwo anders liegt, wo Sie (in einem Switch-Fall) prüfen, was der Benutzer im Frontend ausgewählt hat. 1/2 – paskl

+0

Also damit in Zukunft, mit mehr Filtern, hast du ein großes if else Konstrukt, das schwer zu übersehen ist. Also haben Sie eine Funktion, die WHERE ist eine viel bessere Annäherung. Außerdem würde es dabei doppelten Code töten. 2/2 – paskl

Antwort

0

Wie ich würde baut die WHERE-Klausel (so etwas wie dieses atleast) Nicht getestet

$get_all_users = "SELECT * FROM users" . buildWhereClause($_POST); 

function buildWhereClause($_POST) { 
    $where = 'WHERE 1=1'; 
    foreach($_POST as $k => $v) { 
     //check if $v is valid with a different function 
     switch($k) { 
      case 'gender': 
       $where .= sprintf('AND `gender` = `%s`', $v); 
       break; 
      case 'age': 
       $where .= sprintf('AND `age` = %d', $v); 
       break; 
     } 
    } 
    return $where; 
} 

Dies ist eine sehr lahme Funktion und soll nicht verwendet werden wie . Nur als ein Beispiel, wo es dazu führen könnte. Ich bin sicher, es gibt clevere Möglichkeiten, es zu tun, und Sie wollen nicht immer ein AND.

Verwandte Themen