Hallo PHP-Neuling,
ich sehe den Thread gerade erst und habe noch nicht so ganz durchgeblickt. Aber dieses [0] hinter $_SESSION['listing'] kommt mir schon merkwürdig vor. Warum ist das ein Array?
Mit scheint auch, dass Du es Dir sehr kompliziert machst. Jeder Filter steckt in seinem eigenen Form? Warum machst Du nicht ein Form, wo alle Filter drin sind? Dann musst Du Dich gar nicht damit herumschlagen, was zuvor eingestellt war, du sammelst einfach alles ein, was Du an Parametern bekommst. Allerdings hast Du dann auch die SELECT-Boxen in der Eingabe, wo nichts ausgewählt ist, d.h. Du musst nicht mit isset abfragen, sondern darauf, ob der Parameter einen Leerstring enthält.
$filterWerte = ARRAY();
IF (!empty($_GET['showAK'])) {
$filterWerte[] = "KERN_AKADEMIE = '" . $db->escape($_GET['showAK']) . "'";
}
IF (!empty($_GET['showOrt'])) {
$filterWerte[] = "KERN_DURCHFUEHRUNGSORT = '" . $db->escape($_GET['showOrt']) . "'";
}
...
$filter = IMPLODE(' AND ', $filterWerte);
sollte korrekt ein Array aus WHERE Bedingungen erstellen. Ich persönlich würde die ganzen if
s noch in einer Funktion kapseln, und String Parsing statt Verkettung nehmen. Das geht so:
function addWhereCondition(@$conditions, $parameterName, $dbColumn, $db) {
if (!empty($_GET[$parameterName])) {
$value = mysqli_real_escape_string($db, $_GET[$parameterName]);
$conditions[] = "$dbColumn = '$value'";
// $conditions[] = "$dbColumn = '{$db->escape_string($_GET[$parameterName])}'";
}
}
Edit: !empty statt isset eingebaut
Die auskommentierte Zeile kann die beiden Zeilen davor ersetzen. Es muss aber ein Methodenaufruf auf einem Objekt sein. Einfach nur ein Funktionsaufruf wie mysqli_excape_string ist auch in der complex syntax nicht möglich.
Das Parameterparsing sieht dann so aus:
$filterWerte = ARRAY()
addWhereCondition($filterWerte, 'showAK', 'KERN_AKADEMIE', $db);
addWhereCondition($filterWerte, 'showOrt', 'KERN_DURCHFUEHRUNGSORT', $db);
addWhereCondition($filterWerte, 'showAbgabe', 'KERN_ANGEBOTSABGABE', $db);
addWhereCondition($filterWerte, 'showBindefrist', 'KERN_BINDEFRIST', $db);
addWhereCondition($filterWerte, 'showStatus', 'KERN_STATUS', $db);
addWhereCondition($filterWerte, 'showMassnahmeart', 'KERN_MASSNAHMEART', $db);
$multisort = implode(" AND ", $filterWerte);
Ist doch deutlich übersichtlicher, oder? Kein Session-Eintrag mehr nötig, das merkt sich jetzt der Client. Beim Erzeugen der Ausgabeseite musst Du natürlich dafür sorgen, dass die ausgewählten Filterwerte für die SELECTs auch voreingestellt werden (über die selected-Eigenschaft am <option>
Element).
Ob sich jetzt noch dedlfixens Idee lohnt, Rohdaten und Erzeugung der WHERE-Bedingung zu trennen? Ich weiß nicht. Denn die Rohdaten hast Du ja im $_GET Array. Wenn es für einen anderen Zweck sinnvoll ist, die Filterparameter in einer Datenstruktur beisammen zu haben, dann könnte man das nochmal überlegen. Dann könnte man eine Objektklasse FilterParameter machen, sie mit den $_GET-Parametern initialisieren und eine Methode "createSQL" hinzufügen, die die WHERE-Bedingung erzeugt.
Damit erledigt sich dann auch die Frage, wie man eine einzelne Bedingung wieder entfernt. Einfach eine Leer-Option einstellen.
Rolf
sumpsi - posui - obstruxi