Wie implementiere ich eine Mehrfachauswahl?
Kann ich es ermöglichen, dass der Benutzer mehrere Marken oder Baujahre gleichzeitig auswählen kann? Wie würde ich den Query entsprechend anpassen?
<?php
require "includes/conn.inc.php";
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Modelle</title>
</head>
<body>
<h1>Modelle</h1>
<form method="post">
<label for="marke">
Marke
<input name="marke" type="text">
</label>
<label for="modell">
Modell
<input name="modell" type="text">
</label>
<label for="baujahr">
Baujahr
<input name="baujahr" type="text">
</label>
<button type="submit">Suchen</button>
</form>
<ul>
<?php
// Loop through tbl_marken and create WHERE clause
$where_marke = "";
if (count($_POST) > 0) {
if (array_key_exists("marke", $_POST)) {
if (strlen($_POST["marke"] > 0)) {
$where_marke = "WHERE Markenname LIKE '%" . $_POST["marke"] . "%'";
}
}
}
$conn = openConn();
$markenSql = "
SELECT
*
FROM tbl_marken "
. $where_marke . "
ORDER BY Markenname ASC
";
$marken = $conn->query($markenSql) or die($conn->error);
while ($marke = $marken->fetch_object()) {
echo "<li>";
echo $marke->Markenname;
echo "</li>";
// Loop through tbl_modell and create WHERE clause
echo "<ul>";
$where_modell = "";
if (array_key_exists("modell", $_POST)) {
if (strlen($_POST["modell"] > 0)) {
$where_modell = " AND Modell LIKE '%" . $_POST["modell"] . "%'";
}
}
$modellSql = "
SELECT
*
FROM tbl_modelle
WHERE FIDMarke=" . $marke->IDMarke . $where_modell . "
ORDER BY tbl_modelle.Modell ASC
";
$modelle = $conn->query($modellSql) or die($conn->error);
while ($modell = $modelle->fetch_object()) {
echo "<li>";
echo $modell->Modell;
echo "</li>";
// Loop through baureihen and create WHERE clause
echo "<ul>";
$where_bau = ["FIDModell=" . $modell->IDModell];
if (array_key_exists("baujahr", $_POST)) {
if(intval($_POST["baujahr"])>0) {
$where_bau[] = "BaujahrVon<=" . $_POST["baujahr"];
$where_bau[] = "BaujahrBis>=" . $_POST["baujahr"];
}
}
$bauSql = "
SELECT
*
FROM tbl_baureihen
WHERE " . implode(" AND ", $where_bau)
;
$baureihen = $conn->query($bauSql) or die($conn->error);
while ($baureihe = $baureihen->fetch_object()) {
echo "<li><a href='modell_teile.php?IDBaureihe=" . $baureihe->IDBaureihe . "'>" . $baureihe->BaujahrVon . " - " . $baureihe->BaujahrBis . " </a></li>";
}
echo "</ul>";
}
echo "</ul>";
}
?>
</ul>
</body>
</html>
1 Antwort
Für die Eingabe kannst du dem Nutzer ein Trennzeichen vorgeben (z.B. ein Komma), anhand dessen du später verschiedene Marken oder Baujahre auftrennen kannst.
Beispiel:
$marken = explode(",", $_POST["marke"]);
Die WHERE-Klausel des SQL Query kannst du mit einem OR erweitern.
Beispiel:
WHERE Markenname LIKE '%...%' OR Markenname LIKE '%...%'
Die Eingaben, die von außen (vom Nutzer) kommen, solltest du nicht einfach so in einen SQL-Query konkatenieren, andernfalls öffnest du so den Weg für eine SQL Injection. Verwende stattdessen Prepared Statements. Dynamische Werte werden hierbei durch Platzhalter (?) markiert und später von der MySQLi-Implementation implizit korrekt ausgetauscht (Beispiel).
genau dass ist das Problem, er wartet auf einen parameter der eine SQLinjection ermöglicht in diesem context, Wenn Marken und Baujahre binnem derselben Tabelle sind, kannst du mit nem INNER JOIN arbeiten, sind allerdings die daten in zwei tabellen aufgeteilt, kannst du mit Foreignkeys diese zusammenführen, dein vorhaben hat mehrere lösungen, die effizientere mMn wäre wenn du diese innerhalb einer tabelle zusammenführst