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

Eine zufällige Auswahl von „Bausteinen” aus den Bereichen CSS, PHP, JavaScript und MySQL.

CSS - Fehleingaben in Formularen mit CSS hervorheben

PHP - Bild und Bildinformation anzeigen

JavaScript - Text bei onMouseOver und onMouseOut ersetzen

MySQL - Datensatz Wert erhöhen