Erster Eintrag in eine MySQL-Datenbank mit PHP 1 2 3 4

  1. Die Verbindung zur Datenbank herstellen
  2. Der Aufbau einer Datenbank-Tabelle
  3. Die Datenbank-Tabelle anlegen
  1. Die Daten einfügen, auslesen und bearbeiten
  2. MySQL-Fehlermeldungen anzeigen
  3. Die Daten über ein Formular sicher eintragen
  1. Die Daten über ein Formular bearbeiten
  2. Die Daten sortiert und begrenzt ausgeben
  3. Hinweise zu den MySQL-Anweisungen
  1. Die Daten schnell durchsuchen
  2. Die Ausführung auf dem Webserver
  3. Was fehlt hier noch?

10. Die Daten schnell durchsuchen

Aufgrund zahlreicher Rückmeldungen zeige ich Ihnen hier, wie eine Suchfunktion funktioniert. Eine Suchfunktion ist sehr nützlich für Besucher, besonders für umfangreiche Nachrichten ist diese unverzichtbar. Um nach Daten in unserer „Nachrichten”-Tabelle zu suchen, wird die Datei: suchen.php erstellt die das mit wenigen Anweisungen erledigt.

Nach dem eingegebenen Suchbegriff wird in den Spalten titel, autor, nachricht und kategorie gesucht, die Groß.- und Kleinschreibung des Begriffs spielt dabei keine Rolle.

Dieses Bildschirmfoto zeigt die gefundenen Nachrichten der Suchfunktion an.

Quelltext:  suchen.php AusblendenKopierenLinkZeilen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Nachrichten suchen</title>

  <style>
  body {
   font-family: Verdana, Arial, Sans-Serif;
   background-color: Whitesmoke;
  }

  a:link, a:visited {
   color: Royalblue;
   text-decoration: None;
  }
  </style>


 </head>
<body>

<nav>
 <a href="auslesen.php">Nachrichten</a> |
 <a href="eintragen.php">Eintragen</a> |
 <a href="bearbeiten.php">Bearbeiten</a> |
 <u>Suchen</u>
</nav>

<form action="suchen.php" method="get">
 <p>
  <input type="text" name="suchbegriff" required="required"
   value="<?php echo isset($_GET["suchbegriff"]) ? htmlspecialchars($_GET["suchbegriff"], ENT_HTML5'UTF-8') : '' ?>">
  <input type="submit" name="suche" value="los">
 </p>
</form>

<?php
// Wurde eine Suchanfrage über GET gesendet?
if (isset($_GET["suche"])) {

 
// Leerzeichen im Suchbegriff löschen.
 
$_GET["suchbegriff"] = trim($_GET["suchbegriff"]);

 
// Suchbegriff größer als 3 Zeichen?
 
if (strlen($_GET["suchbegriff"]) >4) {

  
// Verbindung zur Datenbank aufbauen.
  
include "verbinden.php";

  
/* Nachrichten auslesen
   prepare() führt die SQL-Anweisung aus, die eine
   Ergebnismenge als PDO-Statement Objekt zurück gibt. */
  
$select $db->prepare("SELECT *
                          FROM `nachrichten`
                          WHERE (`titel` LIKE :suchbegriff OR
                                 `autor` LIKE :suchbegriff OR
                                 `nachricht` LIKE :suchbegriff OR
                                 `kategorie` LIKE :suchbegriff)
                             AND `anzeige` = '1'
                          ORDER BY `datum` DESC
                          LIMIT 0, 25");

  
/* $select->bindValue() bindet einen Wert an den angegebenen Variablennamen
   (der Platzhalter wird mit dem Inhalt der GET-Variable ersetzt). */
  
$select->bindValue(':suchbegriff''%' $_GET["suchbegriff"] . '%');

  
// $select->execute() führt die vorbereitete Anweisung aus.
  
if ($select->execute() == false) {
   
// Gibt bei einer fehlerhaften Anweisung eine SQL-Fehlermeldung aus.
   
print_r($select->errorInfo());
  }

  
// $select->fetchAll() gibt ein Array mit allen Datensätzen zurück.
  
$nachrichten $select->fetchAll();

  
// Anzahl der Nachrichten überprüfen
  
$AnzahlNachrichten $select->rowCount();
  if (
$AnzahlNachrichten > 0) {
   echo 
'<p>&#9655; ' $AnzahlNachrichten .
    (
$AnzahlNachrichten == ' Nachricht' ' Nachrichten') . ' gefunden.</p>';

   
// Die gefundenen Nachrichten über eine Foreach-Schleife ausgeben.
   
foreach ($nachrichten as $nachricht) {
    
sscanf($nachricht['datum'], "%4s-%2s-%2s"$jahr$monat$tag);
    echo 
'<p><small>$tag '.' $monat '.' $jahr .
     
'</small> - <b>$nachricht['titel'] . '</b><br> Autor: <em>.
     
$nachricht['autor'] . '</em><br> Kategorie: ' .
     
$nachricht['kategorie'] . '<br>.
     
nl2br($nachricht['nachricht']) . '</p>';
   } 
  }
  else {
   echo 
'<p>&#9655; Es wurden keine Nachrichten gefunden!</p>';
  }
 }
 else {
  echo 
'<p>&#9655; Suchbegriff mit mind. 4 Zeichen!</p>';
 }
}
?>

</body>
</html>

Das Script findet nun mit LIKE %Auto% alle Datensätze die das Wort "Auto" enthalten, wie zum Bleistift: "auto", "Automobil", "automatisch" oder "Kaffeeautomat".

Je nach verwendetem Suchbegriff und dessen Zeichenlänge kommen schon mal mehrere hundert Suchergebnisse zustande. Sie können die Suchergebnisse weiter eingrenzen, indem Sie eine der nachfolgenden Optionen hinzufügen:

• Eine Auswahlliste neben dem Suchfeld setzen

Eine Auswahlliste neben dem Suchfeld setzen, in dieser Auswahlliste sollten dann die einzelnen Kategorien der Nachrichten stehen, diese dienen bei der Suche dann als Filter.

<!-- Hier fehlt leider ein Beispiel! -->

• Groß.- und Kleinschreibung beachten

Soll die Groß.- und Kleinschreibung beachtet werden, so muß vor dem Namen der Spalte(n) die Angabe:
BINARY hinzugefügt werden: WHERE (BINARY `titel` LIKE :suchbegriff OR … .

Programmiertechnisch wird das am besten so umgesetzt, das dem Benutzer eine Checkbox zur Verfügung gestellt wird und dieser die Option aktivieren kann.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- ... -->
<label>Suche: <input type="text" name="suchbegriff"></label>
<label><input type="checkbox" name="matchCase">
 Groß.- und Kleinschreibung beachten</label>
<input type="submit" name="suche" value="los">
<!-- ... -->
<?php
// ...
$matchCase = isset($_GET["matchCase"]) ? "BINARY " "";

$select $db->prepare("SELECT *
                        FROM `nachrichten`
                        WHERE (" $matchCase "`titel` LIKE :suchbegriff OR
                               " $matchCase "`autor` LIKE :suchbegriff OR
                               " $matchCase "`nachricht` LIKE :suchbegriff OR
                               " $matchCase "`kategorie` LIKE :suchbegriff)
                           AND `anzeige` = '1'
                        ORDER BY `datum` DESC
                        LIMIT 0, 25");
// ...
?>

⚑ Volltext - Mehrere Begriffe finden

Für bestimmte Spalten in der Tabelle kann man einen Volltext (engl. fulltext) setzen. Es können dann mehrere Begriffe gefunden werden. Mit dem Programm: "phpMyAdmin" (siehe weiter unten) ist das ganz einfach: Tabelle auswählen > Registerreiter: Struktur > Spalte auswählen (Checkbox) und dann auf "Volltext" klicken.

In unserer Tabelle wäre es zum Beispiel für die Spalte: `nachricht` sinnvoll. Die zusätzliche MySQL-Anweisung könnte dann etwa so aussehen:

     OR MATCH (`nachricht`)
     AGAINST (:suchbegriff IN BOOLEAN MODE) AND `anzeige` = '1'

Mit der optionalen MySQL-Anweisung IN BOOLEAN MODE, können neben dem zu suchenden Begriff bestimmte Operatoren gesetzt werden, hier eine kleine Auswahl:

➤ Der Volltext konnte bis zu MySQL-Version: 5.5 nur für die Storage-Engine: "MyISAM" verwendet werden. Ab MySQL-Version: 5.6 ist dieser auch für: "InnoDB" verfügbar.

Für den zu suchenden Begriff, sollte eine Stoppwortliste verwendet werden. Mit dieser Stoppwortliste kann man dann bestimmte Wörter (z.B.: das, ist, etwas, viel) aus dem Begriff heraus filtern, da das Ergebnis der Anfrage ansonsten sehr viele Suchergebnisse liefern könnte.

⚑ Datensatz direkt bearbeiten

Um den gefundenen Datensatz direkt bearbeiten zu können, fügen Sie einen Link zur Datei: bearbeiten.php mit der entsprechenden ID des Datensatzes hinzu.

1
2
3
4
<?php
// Datensatz bearbeiten
echo '<a href="bearbeiten.php?id=' .  $nachricht['id'] . '">bearbeiten</a>';
?>

Natürlich sollte diese Funktion nicht jedem Benutzer zur Verfügung stehen, sondern nur dem Admin. der sich zuvor über einem Log-in authentifiziert hat.

11. Die Ausführung auf dem Webserver

Die Vorbereitung hat geraume Zeit in Anspruch genommen, aber das anlegen und die ersten Einträge in die Tabelle sind innerhalb von wenigen Minuten erledigt.

Unsere Dateien die wir für das anlegen, zum eintragen, bearbeiten und ausgeben benötigen haben wir nun zusammen; Hier eine Checkliste:

Alles OK, dann führen Sie folgende Anweisungen nacheinander aus:

  1. Ihre DB-Zugangsdaten tragen Sie in der Datei: verbinden.php ein.
  2. Laden Sie alle Dateien auf dem Webserver hoch.
  3. Rufen Sie die Datei: anlegen.php im Browser auf.
  4. Nach erfolgreichem anlegen tragen Sie Ihren ersten Eintrag mit der Datei: eintragen.php ein.
  5. Sollten keine Fehlermeldungen erscheinen, haben Sie alles richtig gemacht

Da ich Ihnen die Arbeit mit dem kopieren ersparen möchte, habe ich die Dateien in einem ZIP-Archiv für Sie zusammen gepackt  mysql_datenbank.zip

12. Was fehlt hier noch?

Um die Beispiele hier möglichst einfach zu halten und um Ihnen nicht alle Arbeit abzunehmen („Learning by Doing”), wurden einige Funktionen nicht integriert, diese kann jeder selbst programmieren.

Ein komplettes Nachrichten-System finden Sie im Archiv unter: Nachrichten

⚑ Die Datenbank-Tabelle erweitern

Irgendwann möchte man die Datenbank-Tabelle um neue Spalten erweitern oder die Tabellen sichern, importieren, exportieren oder andere Verwaltungsaufgaben erledigen. Da dies jedoch nicht so einfach möglich ist, gibt es kostenlose Programme die das dann für einem erledigen.

phpMyAdmin ist bei vielen Webhostern bereits auf dem Server verfügbar. phpMyAdmin ist ein in PHP geschriebenes Werkzeug, das zur Verwaltung von Datenbanken über das Web gedacht ist.
phpMyAdmin.net

Adminer ist ein Tool zur vollständigen Verwaltung von Datenbanken. Adminer ist komplett in PHP geschrieben und besteht, im Gegensatz zu phpMyAdmin, aus einer einzigen Datei, die auf dem Server abgelegt wird. adminer.org

Zum Erstellen und Verwalten von Backups (DB-Sicherungen) auf Webservern werden häufig die ebenfalls in PHP geschriebenen Open-Source-Anwendungen phpMyBackupPro oder MySQLDumper eingesetzt.

Fazit

Sie sehen an den Beispielen also, das es recht einfach ist Daten in eine DB-Tabelle einzutragen / zu bearbeiten und man schnell zu einem brauchbaren Ergebnis gelangt, wer möchte da noch mit Text-Dateien arbeiten Ein späterer Umstieg auf andere Datenbanken (zum Beispiel: SQLite) wird durch PDO leichter und noch ein wenig bequemer Dank einheitlicher Funktionsaufrufe.

Hoffentlich fanden Sie dieses kurze Tutorial nützlich!

Tipps

Nachrichten als CSV-Datei exportieren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
// Nachrichten als CSV-Datei exportieren

// Verbindung zur Datenbank
include "verbinden.php";

$trennzeichen ',';
$inhalt '';

/*  Spaltenüberschriften hinzufügen
$inhalt = 'id' . $trennzeichen .
'titel' . $trennzeichen .
'autor' . $trennzeichen .
'nachricht' . $trennzeichen .
'kategorie' . $trennzeichen .
'anzeige' . $trennzeichen .
'datum' . $trennzeichen .
PHP_EOL;
 */

// Nachrichten auslesen
$select $db->query("SELECT `id`, `titel`, `autor`, `nachricht`, `kategorie`, `anzeige`, `datum`
 FROM `nachrichten`
 ORDER BY `datum` DESC");

$nachrichten $select->fetchAll();

foreach (
$nachrichten as $nachricht) {
    
$inhalt .=
        
$nachricht["id"] . $trennzeichen .
        
$nachricht["titel"] . $trennzeichen .
        
$nachricht["autor"] . $trennzeichen .
        
$nachricht["nachricht"] . $trennzeichen .
        
$nachricht["kategorie"] . $trennzeichen .
        
$nachricht["anzeige"] . $trennzeichen .
        
$nachricht["datum"] .
        
PHP_EOL;
}

// Zeitzone und das aktuelle Datum setzen
$jetzt date_create("now"timezone_open("Europe/Berlin"));
$datum date_format($jetzt"Y-m-d_H-i");

// Dateiname der CSV-Datei
$dateiname $datum '.csv';

// CSV-Datei speichern
file_put_contents($dateiname$inhalt);

SQLite-Datenbank mit PHP und PDO erstellen - So erstellen und verbinden Sie eine Datenbank in SQLite. Der Vorteil von SQLite ist, das die Datenbank eine Text-Datei ist und keine Verbindung zu einem Datenbank-Server benötigt. Ideal für kleinere Datenmengen oder wenn die Datenbank transportabel sein soll.

Checkbox (Mehrfachauswahl) und DB-Ausgabe - Mit den Checkboxen lassen sich mehrere Einträge von der DB-Tabelle auswählen, auswerten und ausgeben.

MySQL - Einfügen oder aktualisieren mit 'ON DUPLICATE KEY UPDATE'

Authentifizierung eines Benutzers mit PDO und password_verify()

1keydata.com - SQL-Tutorial - Das SQL-Tutorial führt häufig verwendete SQL-Anweisungen auf.