Erster Eintrag in eine MySQL-Datenbank mit PHP

  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?

7. Die Daten über ein Formular bearbeiten

Damit Sie die Daten ändern und löschen können, erstellen Sie dazu ein Formular. Ich möchte hier nicht mit den Grundlagen von HTML und PHP anfangen, sondern Ihnen ein fertiges Script präsentieren das die Funktionsweise zeigt wie einzelne Daten aus der Datenbank-Tabelle bearbeitet werden können.
Oh, natürlich gibt es noch andere Vorgehensweisen wie man so etwas bewerkstelligen (lösen) könnte (zum Beispiel mit dem sog. EVA-Prinzip), diese Vorgehensweise hier ist aber leichter verständlich und besser nachvollziehbar.

In diesem Formular werden Eingabefelder, Textbereiche, Auswahllisten, Radio-Buttons und Checkboxen benutzt (um Ihre alten HTML-Kenntnisse noch einmal aufzufrischen ) und wie diese im Zusammenhang mit PHP/MySQL verwendet werden.

Nachdem auf dem Link Nachricht bearbeiten geklickt wurde, wird das Formular zum bearbeiten einer Nachricht angezeigt.

Quelltextbearbeiten.phpKopierenAusblendenZeilen

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Nachrichten bearbeiten</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> |
 <u>Bearbeiten</u> |
 <a href="suchen.php">Suchen</a>
</nav>

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

// Die Nachricht aus der Datenbank zum bearbeiten in ein Formular laden.
// Wurde eine ID über $_GET gesendet?
if (isset($_GET["id"])) {

 
// Nachricht mit der ID auslesen
 // prepare() bereitet die Anweisung für das auslesen vor.
 
$select $db->prepare("SELECT `id`, `titel`, `autor`, `nachricht`, `kategorie`, `anzeige`, `datum`
                         FROM `nachrichten`
                         WHERE `id` = :id");

 
// Der Platzhalter wird mit $select->bindParam() durch den Inhalt der GET-Variablen maskiert.
 
$select->bindParam(':id'$_GET["id"], PDO::PARAM_INT);
 
$select->execute(); // Führt die Anweisung aus.

 // $select->fetch() holt die betreffende Zeile aus dem Ergebnis.
 
$nachricht $select->fetch();

 
// Mit $select->rowCount() überprüfen ob ein Datensatz zurückgegeben wurde.
 
if ($select->rowCount() == 1) {

 
// Die Auswahlliste für die Kategorie erstellen
 
$AuswahllisteKategorie '<select name="kategorie" size="1">';
 
$kategorien = ["Aktuell""Hardware""Software"];
 foreach (
$kategorien as $kategorie) {
  
$AuswahllisteKategorie .= '<option' .
  (
$kategorie == $nachricht["kategorie"] ? ' selected="selected"' '') .
  
'>$kategorie '</option>';
 }
 
$AuswahllisteKategorie .= '</select>';

  
// Die Checkbox auswählen
  
$anzeigeCK = ($nachricht["anzeige"] == "1") ? ' checked="checked"' '';

  
// Formular zum bearbeiten der Nachricht ausgeben
  
echo '<form action="bearbeiten.php" method="post">
   <p>
    <label>Titel: 
     <input type="text" name="titel" value="' $nachricht["titel"] . '" size="45" maxlength="80" required="required">
    </label>
   </p>

   <p>
    <label>Autor: 
     <input type="text" name="autor" value="' $nachricht["autor"] . '" size="25" maxlength="30" required="required">
    </label>
   </p>

   <p>
    <label>Kategorie: 
     ' $AuswahllisteKategorie '
    </label>
   </p>

   <p>
    <label>Nachricht: <br>
     <textarea rows="10" cols="40" name="nachricht" required="required">$nachricht["nachricht"] . '</textarea>
    </label>
   </p>

   <p>
    <label>
     <input type="checkbox" name="anzeige"' $anzeigeCK '> Nachricht anzeigen
    </label>
   </p>

   <p>
    <label><input type="radio" name="option" value="edit" checked="checked"> Ändern</label>
    <label><input type="radio" name="option" value="delete" required="required"> Löschen</label>
    <input type="hidden" name="id" value="' $nachricht["id"] . '">
   </p>

   <p>
    <input type="submit" name="execute" value="Absenden">
   </p>
  </form>';
 }
 else {
  echo 
'<p>Dieser Datensatz ist nicht vorhanden!</p>';
 }
}

// Nachricht ändern oder löschen
if (isset($_POST["execute"])) {

 
// Nachricht ändern
 
if ($_POST["option"] == 'edit') {

  
// Die Formulareingaben müssen hier überprüft werden,
  // siehe: https://werner-zenk.de/tipps/php_mit_sicherheit.php

  // Der Variable: $anzeige einen Wert zuweisen, entweder 1 oder 0.
  // Je nachdem ob die Checkbox gesetzt (ausgewählt) wurde.
  
$anzeige = isset($_POST["anzeige"]) ? 0;

  
// prepare() (prepare = aufbereiten) bereitet die Anweisung für die Ausführung vor.
  
$update $db->prepare("UPDATE `nachrichten`
                          SET
                            `titel`     = :titel,
                            `autor`     = :autor,
                            `nachricht` = :nachricht,
                            `kategorie` = :kategorie,
                            `anzeige` = :anzeige
                          WHERE `id` = :id");

  
// Die Platzhalter werden über ein assoziatives Array mit dem Inhalt der POST-Variablen übergeben.
  // $update->execute() führt die Anweisung dann aus.
  
if ($update->execute( [':titel' => $_POST["titel"],
                         
':autor' => $_POST["autor"],
                         
':nachricht' => $_POST["nachricht"],
                         
':kategorie' => $_POST["kategorie"],
                         
':anzeige' => $anzeige,
                         
':id' => $_POST["id"] ])) {
   echo 
'<p>&#9655; Die Nachricht wurde überschrieben.</p>';
  }
  else {
   
// SQL-Fehlermeldung anzeigen.
   
print_r($update->errorInfo());
  }
 }

 
// Nachricht löschen
 
if ($_POST["option"] == 'delete') {

  
// prepare() bereitet die Anweisung für die Ausführung vor.
  
$delete $db->prepare("DELETE FROM `nachrichten`
                          WHERE `id` = :id");

  
// Der Platzhalter wird über ein assoziatives Array mit dem Inhalt der POST-Variable übergeben.
  // $delete->execute() führt die Anweisung dann aus.
  
if ($delete->execute( [':id' => $_POST["id"] ])) {
   echo 
'<p>&#9655; Die Nachricht wurde gelöscht.</p>';
  }
 }
}

// Nachrichten auslesen
// $select->query() führt die SQL-Anweisung aus,
// die eine Ergebnismenge als PDOStatement Objekt zurück gibt.
$select $db->query("SELECT `id`, `titel`, `autor`, `nachricht`, `kategorie`, `anzeige`, `datum`
                      FROM `nachrichten`
                      ORDER BY `datum` DESC");

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

// Anzahl der Nachrichten mit count($nachrichten) ausgeben.
echo '<h4>count($nachrichten) .
 (
count($nachrichten) == ' Nachricht' ' Nachrichten') . '</h4>';

// Ausgabe über eine Foreach-Schleife
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) . '<br>.
  
'Anzeige: ' $nachricht->anzeige ' - ' .
  
'<a href="?id=' $nachricht->id '"><small>Nachricht bearbeiten</small></a></p>';
}
?>

</body>
</html>

Um das Script hier möglichst einfach zu halten, werden die Formulareingaben des Benutzers nicht validiert (überprüft), Zeile 120. Dies müssen Sie selbst einbauen wenn Sie das Script im produktiven Einsatz verwenden wollen. Siehe: PHP mit Sicherheit

8. Die Daten sortiert und begrenzt ausgeben

Die Nachrichten möchte man dem Besucher der Website auch präsentieren. Es werden hier alle Datensätze ausgelesen die in der DB-Spalte `anzeige` den Wert 1 haben, die also dem Besucher angezeigt werden sollen WHERE `anzeige` = '1'. Die Nachrichten werden absteigend nach dem Datum angezeigt, die neusten zuerst, mit ORDER BY `datum` DESC in der Anweisung.

Damit nicht alle Nachrichten auf einmal auf der Seite zu sehen sind (dies ist oft bei großen Datenmengen unerwünscht), sondern übersichtlich auf mehreren Seiten verteilt stehen, wird hier eine Seiten-Navigation (Pagination) benutzt.

Mit den Pfeil-Symbolen (◄ ►) kann man zur nächsten oder vorherigen Seite wechseln oder einfach direkt durch die Eingabe einer Seitenzahl in ein Formularfeld.

Dieses Bildschirmfoto zeigt die Nachrichten mit der Seiten-Navigation an.

Quelltextauslesen.phpKopierenAusblendenZeilen

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
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Nachrichten</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>
 <u>Nachrichten</u> |
 <a href="eintragen.php">Eintragen</a> |
 <a href="bearbeiten.php">Bearbeiten</a> |
 <a href="suchen.php">Suchen</a>
</nav>

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

// Anzahl der Datensätze (Nachrichten) pro Seite
$DatensaetzeSeite 2;

// Anzahl der Datensätze ermitteln
$AnzahlDatensaetze $db->query("SELECT COUNT(*) FROM `nachrichten` WHERE `anzeige` = '1'")->fetchColumn(0);

// Sind Datensätze vorhanden?
if ($AnzahlDatensaetze > 0) {

 
// Die Anzahl der Seiten ermitteln
 
$AnzahlSeiten ceil($AnzahlDatensaetze $DatensaetzeSeite);

 
// Die aktuelle Seite ermitteln
 
$AktuelleSeite = isset($_GET["seite"]) ? $_GET["seite"] : 1;

 
// Den Wert überprüfen und ggf. ändern
 
$AktuelleSeite ctype_digit($AktuelleSeite) ? $AktuelleSeite 1;
 
$AktuelleSeite $AktuelleSeite < || $AktuelleSeite > $AnzahlSeiten $AktuelleSeite;

 
// Den Versatz ermitteln
 
$Versatz $AktuelleSeite $DatensaetzeSeite $DatensaetzeSeite;
 
 
// Alle Datensätze auslesen die in der DB-Spalte `anzeige` den Wert 1 haben.
 // Mit LIMIT die Ausgabe der Datensätze begrenzen (Versatz und Datensätze pro Seite).
 
$select $db->prepare("SELECT `titel`, `autor`, `nachricht`, `kategorie`, `datum`
                         FROM `nachrichten`
                         WHERE `anzeige` = '1'
                         ORDER BY `datum` DESC
                         LIMIT :versatz, :DatensaetzeSeite");
 
$select->bindParam(':versatz'$VersatzPDO::PARAM_INT);
 
$select->bindParam(':DatensaetzeSeite'$DatensaetzeSeitePDO::PARAM_INT);
 
$select->execute();
 
$nachrichten $select->fetchAll();

 
// Ausgabe über eine Foreach-Schleife
 
foreach ($nachrichten as $nachricht) {
  
// Mit sscanf() wird das Format des Datums in die Variablen $jahr, $monat und $tag extrahiert.
  
sscanf($nachricht['datum'], "%4s-%2s-%2s"$jahr$monat$tag);

  echo 
'<p><small>$tag '.' $monat '.' $jahr .
   
'</small> - <b>$nachricht['titel'] . '</b><br>.
   
' Kategorie: ' $nachricht['kategorie'] . '<br>.
   
' Autor: <em>$nachricht['autor'] . '</em><br>.
   
nl2br($nachricht['nachricht']) . '</p>';
 }

 
// Formular.- und Blätterfunktion (Wer sich da auskennt bekommt einen Preis verliehen ;)
 
echo '<form action="auslesen.php" method="GET" autocomplete="off">
  ((
$AktuelleSeite 1> ?
    
'<a href="?seite=' . ($AktuelleSeite 1) . '">&#9668;</a>:
    
&#9668;') .
 
<label>Seite <input type="text" value="' $AktuelleSeite '" name="seite" size="3"' .
 
' title="Seitenzahl eingeben und die Eingabetaste drücken."> von ' $AnzahlSeiten '</label>.
  ((
$AktuelleSeite 1<$AnzahlSeiten ?
    
<a href="?seite=' . ($AktuelleSeite 1) . '">&#9658;</a>:
    
&#9658;') .
 
'</form>';
}
else {
 echo 
'<p>Keine Nachrichten vorhanden!</p>';
}
?>

</body>
</html>

9. Hinweise zu den MySQL-Anweisungen

MySQL-Anweisungen (Schlüsselwörter wie z. B.: SELECT, FROM, WHERE, UPDATE, INSERT) sollten zur besseren Lesbarkeit groß geschrieben werden und um diese von den Spalten-Bezeichnungen zu unterscheiden.

Der Name der Tabelle und die Spalten-Bezeichnungen sollten in Backticks (`) (oder Backquote, deutsch für: rückwärts geneigtes Hochkomma) `spalte` gesetzt werden. Backticks erzeugt man mit der Umschalt + Apostroph-Taste.

Beispiel: SELECT `id`, `titel`, `autor` FROM `nachrichten` WHERE `id` = 1

Spalten-Bezeichnungen dürfen keine MySQL-Anweisungen (wie z. B.: ALTER), Umlaute oder Sonderzeichen enthalten. Beim auslesen und bearbeiten der Daten muss die Groß.- und Kleinschreibung der Spalten-Bezeichnungen beachtet werden (genauso wie diese in der Datenbank-Tabelle angelegt wurden).

Zeichenketten und Datumsangaben müssen innerhalb einer MySQL-Anweisung immer in Anführungszeichen gesetzt sein, Zahlen nicht. Es ist egal, ob dies einfache oder doppelte Anführungszeichen sind, das Zeichen für den Anfang muss aber mit dem Zeichen für das Ende übereinstimmen.

MySQL-Anweisungen die hier in den Beispielen verwendet werden

SELECT * wählt alle Spalten der Tabelle aus (sollte aber nur verwendet werden wenn wirklich alle Spalten benötigt werden).

SELECT `id`, `titel`, `autor` wählt bestimmte Spalten in der Tabelle aus.

Das FROM gibt die Tabelle an, aus der die Datensätze abgerufen werden sollen, zum Beispiel: FROM `nachrichten`.

Die WHERE-Klausel bestimmt Bedingungen, auch Filter genannt, unter denen die Daten ausgegeben werden sollen, zum Beispiel: WHERE `id` = 12.

LIKE ist eine String-Vergleichsfunktion (diese Funktion vergleicht also einen bestimmten Text in einer Spalte, z. B.: LIKE '%Auto%') und führt die Überprüfung auf Zeichenbasis durch (Groß.- und Kleinschreibung wird nicht beachtet). % ist ein Platzhalter für einen beliebigen Inhalt vor und/oder hinter einem Suchbegriff. Gefunden werden zum Beispiel: "Auto", "auto", "Automobil", "automatisch" oder "Fahrautomat".
Mehr dazu, siehe: Die Daten schnell durchsuchen auf der nächsten Seite.

Mit dem Schlüsselwort ORDER BY kann man festlegen, in welcher Spalte die Datensätze sortiert werden sollen, zum Beispiel: ORDER BY `datum`. Außerdem können ASC (Ascending aufsteigend, von klein nach groß) und DESC (Descending absteigend, von groß nach klein) benutzt werden um die Tabelle (je nach Feldtyp) alphabetisch, chronologisch oder numerisch zu sortieren.

Die LIMIT-Anweisung dient zur Beschränkung der Anzahl der von der SELECT-Anweisung zurückgegebenen Datensätze. Beispiel: LIMIT 5, 10 Von den beiden Argumenten gibt das erste den Versatz des ersten zurückzugebenden Datensatzes an, das zweite die maximale Anzahl zurückzugebender Datensätze.

NOW() fügt das aktuelle Datum in die Spalte ein (Feldtyp: "DATE", beim Feldtyp: "DATETIME" zusätzlich die Uhrzeit).

Vergleichsoperatoren zwischen Spaltennamen und Ausdrücken

Einige dieser Vergleichsoperatoren kennen Sie sicher schon von PHP.

= gleich SELECT `spalte` FROM `tabelle` WHERE `spalte` = 5
= gleich SELECT `spalte` FROM `tabelle` WHERE `spalte` = 'Mike'
<> verschieden (ungleich) SELECT `spalte` FROM `tabelle` WHERE `spalte` <> 5
<> verschieden (ungleich) SELECT `spalte` FROM `tabelle` WHERE `spalte` <> 'Mike'
< kleiner SELECT `spalte` FROM `tabelle` WHERE `spalte` < 5
> größer SELECT `spalte` FROM `tabelle` WHERE `spalte` > 5
<= kleiner oder gleich SELECT `spalte` FROM `tabelle` WHERE `spalte` <= 5
>= größer oder gleich SELECT `spalte` FROM `tabelle` WHERE `spalte` >= 5
BETWEEN Zwischen zwei Werten liegend. SELECT `spalte` FROM `tabelle` WHERE `spalte` BETWEEN 3 AND 10
IN Prüft, ob der linke Ausdruck in einem der rechten vorkommt. SELECT `spalte` FROM `tabelle` WHERE `spalte` IN ('Mike', 'Paul', 'David')

Logische Operatoren, die Ausdrücke mit Vergleichsoperatoren verknüpfen

AND Beide Bedingungen müssen erfüllt sein. SELECT `spalte` FROM `tabelle` WHERE `spalte` < 10 AND `spalte` >= 5
OR Mindestens eine Bedingung muß erfüllt sein. SELECT `spalte` FROM `tabelle` WHERE `spalte` = 10 OR `spalte` = 5
Die Daten schnell durchsuchen

Die Daten einfügen, auslesen und bearbeiten