MySQL - Mit mehreren Begriffen gleichzeitig suchen
Dieses Script sucht in 2 DB-Spalten (`datum`
und `uhrzeit`
) nach mehreren Begriffen gleichzeitig.
Folgende DB-Tabelle wurde verwendet:
CREATE TABLE `t_termin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datum` date NOT NULL, `uhrzeit` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; INSERT INTO `t_termin` (`id`, `datum`, `uhrzeit`) VALUES (1, '2017-12-28', '22:45'), (2, '2017-12-29', '22:45'), (3, '2017-12-31', '23:30');
Beispiele für Suchbegriffe und Ausgabe:
Suche > 28.12.2017 22:45
ID: 1
Datum: 28.12.2017
22:45 Uhr
ID: 2
Datum: 29.12.2017
22:45 Uhr
Suche > 28.12.2017 22:00
ID: 1
Datum: 28.12.2017
22:45 Uhr
Suche > 28.12.2017 22:45 23:30
ID: 1
Datum: 28.12.2017
22:45 Uhr
ID: 2
Datum: 29.12.2017
22:45 Uhr
ID: 3
Datum: 31.12.2017
23:30 Uhr
Suche > 20.12.2017 23:30
ID: 3
Datum: 31.12.2017
23:30 Uhr
➤ Wenn nicht nach Datumsangaben oder Zeitangaben gesucht wird, sondern nach ganz normalem Text, dann sollte eine Stoppwortliste hinzugefügt werden. Diese filtert dann Wörter wie: "und", "oder", "sowie" etc. aus dem Suchbegriff heraus.
In diesem Script werden zur Anfrage an die DB-Tabelle die PDO-Funktionen von PHP verwendet.
<form method="post">
<label>Suche: <input type="text" name="q" value="28.12.2017 22:45"></label>
<input type="submit" value="Absenden">
</form>
<?php
// Mit mehreren Begriffen gleichzeitig suchen
if (isset($_POST["q"])) {
// Auf Leerzeichen prüfen
$search = preg_split('/[\s]+/', $_POST["q"]);
// Enthält mehr als einen Begriff
if (count($search) > 1) {
// Wörter filtern wenn diese weniger als 3 Buchstaben haben.
$searchfield = [];
foreach ($search as $s) {
if (mb_strlen($s) >= 3) {
$searchfield[] = $s;
}
}
$totalwords = count($searchfield);
// SQL- Platzhalter (Evtl. erweitern!)
$placeholder = [":p1", ":p2", ":p3", ":p4", ":p5",];
if ($totalwords > 0 &&
$totalwords <= count($placeholder)) {
$string1 = ""; // DATE_FORMAT(`datum`,'%d.%m.%Y')
foreach($searchfield as $key => $searchword) {
$string1 .= " DATE_FORMAT(`datum`,'%d.%m.%Y')" . " LIKE " . $placeholder[$key];
if ($key != ($totalwords - 1)) {
$string1 .= " OR ";
}
}
$string2 = ""; // `uhrzeit`
foreach($searchfield as $key => $searchword) {
$string2 .= " `uhrzeit`" . " LIKE " . $placeholder[$key];
if ($key != ($totalwords - 1)) {
$string2 .= " OR ";
}
}
// SQL zusammensetzen
$SQL = "SELECT `id`, DATE_FORMAT(`datum`,'%d.%m.%Y') AS `datum`, `uhrzeit`
FROM `t_termin`
WHERE
( " . $string1 . " )
OR
(" . $string2 . " )
ORDER BY `datum` ASC";
// Zum testen!
echo '<pre>' . $SQL . '</pre>';
// Verbindung zur Datenbank
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$select = $db->prepare($SQL);
// bindValue mit den Platzhaltern und Werten setzen
foreach ($searchfield as $key => $wort) {
$like = "%" . $wort . "%";
$select->bindValue($placeholder[$key], $like);
}
// Anfrage ausführen
$select->execute();
$events = $select->fetchAll();
if ($select->rowCount() > 0) {
// Ausgabe
foreach ($events as $event) {
echo '<p>ID: ' . $event["id"] . '<br>' .
'Datum: ' . $event["datum"] . '<br>' .
$event["uhrzeit"] . ' Uhr</p>';
}
}
else {
echo '<p>Keine Einträge gefunden!</p>';
}
}
}
else {
// Hier mit der Suche weitermachen wenn es nur einen Suchbegriff gibt!
}
}
?>
Bausteine Alle Anzeigen
Eine zufällige Auswahl von Codeschnipseln
aus den Bereichen
HTML, CSS,
PHP, JavaScript und
MySQL.
<pre> Präformatierter Text