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 &&
      
$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.

<del> Logische Auszeichnung

CSS - Vertikale Schrift

PHP - Redirect auf eine andere Seite

JavaScript - JavaScript-Version des Browsers anzeigen

MySQL - Alle Einträge nach einem Tag löschen

Seitentitel
Der Seitentitel ist sehr wichtig <title> Seitentitel </title>, in diesem Teil vorkommende Wörter werden von den Suchmaschinen besonders stark gewertet. Außerdem, wenn die Seite zu den Favoriten/Bookmarks hinzugefügt wird, wird dort auch der Seitentitel angezeigt. Oder können Sie sich unter einem Bookmark mit dem Namen "Seite 2" etwas vorstellen??
Tipp: Wechseln Sie einfach mal zu den diversen Suchdiensten wie Google oder Bing! und geben Sie dort als Suchbegriff "NEWPAGE" ein. Ich habs versucht und schlappe 22000 Treffer erzielt. "INDEX" hat noch mehr ergeben.