1k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich möchte zu einer Datenbank mit Nutzerdaten (Anrede, Name, Anschrift, Alter etc...) eine Selektion durchführen. Das heißt entweder, es werden alle Datensätze angezeigt oder je nach Eingaben in einem Formular nur bestimmte. Grundsätzlich ist das kein Problem für mich, allerdings ist die Auswertung des Formulars scheinbar ziemlich aufwendig. Vielleicht könnt ihr mir hier weiterhelfen, wie ich das evtl. besser machen kann.

Im Detail:
Das Formular beinhaltet momentan nur Zwei Input-Felder für das Geburtsjahr (von, bis), zwei für PLZ (von, bis) und noch einige andere die aber unwichtig sind. Mir gehts um diese von-bis-Felder.
Also grundsätzlich habe ich es so gemacht, dass ich abhängig von den Eingaben einen SQL-String zusammenbaue den ich ganz zum Schluss abschicke. Das sollte ja erstmal ok sein oder?
Was mir jtezt genau Kopfschmerzen bereitet ist die Auswertung von-bis.

Bei mir sieht das etwa so aus:


if ($_POST['zip_from'] AND $_POST['zip_to'] AND ctype_digit($_POST['zip_from']) AND ctype_digit($_POST['zip_to'])) {
$sql .= " WHERE zip BETWEEN '".$_POST['zip_from']."' AND '".$_POST['zip_to']."'";
} elseif ($_POST['zip_from'] AND ctype_digit($_POST['zip_from'])) {
$sql .= " WHERE zip >= '".$_POST['zip_from']."'";
} elseif ($_POST['zip_to'] AND ctype_digit($_POST['zip_to'])) {
$sql .= " WHERE zip <= '".$_POST['zip_to']."'";
}


Geht das wirklich nicht leichter? ich muss dsa ja immerhin für alle entsprechenden von-bis-Felder machen...irgendwie gefällt mir die Lösung nicht...
Vielen Dank schon mal

1 Antwort

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Das könnte man folgendermaßen generalisieren:



// alle möglichen Parameter einmalig definiert:
// - name = $POST-Parameter, sprich HTML-Variablenname
// - type = Datentyp; zeigt uns, wie wir später damit umgehen
// - coloper = DB-Spaltenname und Operand
$aParam= array
( array( 'name'=> 'zip_from', 'type'=> 'int', 'coloper'=> 'zip>= ' )
, array( 'name'=> 'zip_to', 'type'=> 'int', 'coloper'=> 'zip<= ' )
);

$sWhere= '';
foreach( $aParam as $v1 ) { // alle übergebenen Parameter durchlaufen
if( isset( $_POST[$v1['name']] ) ) { // kennen wir einen davon?
if( $v1['type']== 'int' ) { // Datentyp "integer"
if( ctype_digit( $_POST[$v1['name']] ) ) { // ist es auch wirklich eine Zahl? Ansonsten ignorieren
$sWhere.= ' AND '. $v1['coloper']. (int)$_POST[$v1['name']]; // WHERE-String erweitern
}
} else die( 'unbekannter typ: '. $v1['type'] ); // unbekannter Datentyp
}
}

// überhaupt Text zusammengesetzt worden? Dann erste AND durch WHERE ersetzen
if( $sWhere!= '' ) $sWhere= ' WHERE '. substr( $sWhere, 5 );
...