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.

<mark> Physische Auszeichnung

CSS - Ladeanimation ohne Bild-Grafik

PHP - BBCode aus dem Text entfernen

JavaScript - Die Höhe eines IFrames automatisch dem Inhalt anpassen

MySQL - Bei doppelter HOST-Adresse in der Tabelle warnen

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.