11. Unterrichtsblock
MySQL – Erstellung von Tabellen
Eine Datenbanktabelle hat einen eigenen eindeutigen Namen und besteht aus Spalten und Zeilen.
Erstellung einer MySQL-Tabelle mit MySQLi und PDO
Die CREATE TABLE
-Anweisung wird zum Erstellen einer Tabelle in MySQL verwendet. Im folgenden Beispiel erstellen wir eine Tabelle mit dem Namen „meineFreunde“ mit fünf Spalten: „id“, „vorname“, „nachname“, „email“ und „reg_datum“:
CREATE TABLE meineFreunde (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(30) NOT NULL,
nachname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Hinweise zur obigen Tabelle:
Nach dem Namen der Spalte kommt der Datentyp. Der Datentyp gibt an, welche Art von Daten die Spalte enthalten kann. Eine vollständige Referenz aller verfügbaren Datentypen findet sich hier: https://www.w3schools.com/sql/sql_datatypes.asp
Nach dem Datentyp kann man für jede Spalte weitere optionale Attribute angeben:
NOT NULL
– Jede Zeile muss einen Wert für diese Spalte enthalten. Nullwerte sind nicht zulässigDEFAULT
-Wert – Legt einen Standardwert fest, der hinzugefügt wird, wenn kein anderer Wert übergeben wirdUNSIGNED
– Wird für Zahlentypen verwendet und beschränkt die gespeicherten Daten auf positive Zahlen und NullAUTO_INCREMENT
– MySQL erhöht den Wert des Felds jedes Mal automatisch um 1, wenn ein neuer Datensatz hinzugefügt wirdPRIMARY KEY
– Wird zur eindeutigen Identifizierung der Zeilen in einer Tabelle verwendet. Die Spalte mit der EinstellungPRIMARY KEY
ist oft eine ID-Nummer und wird oft mitAUTO_INCREMENT
verwendet
Jede Tabelle sollte eine Primärschlüsselspalte haben (in diesem Fall: die Spalte „id“). Sein Wert muss für jeden Datensatz in der Tabelle eindeutig sein.
Die folgenden Beispiele zeigen, wie die Tabelle in PHP erstellt wird:
Beispiel (MySQLi objektorientiert)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Verbindung herstellen
$verbindung = new mysqli($servername, $nutzer, $passwort, $dbname);
// Verbindung prüfen
if ($verbindung->connect_error) {
die("Verbindung fehlgeschlagen: " . $verbindung->connect_error);
}
/*
### Verbindungsblock Ende ###
*/
// SQL Erstellung einer Tabelle
$sql = "CREATE TABLE meineFreunde (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(30) NOT NULL,
nachname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
if ($verbindung->query($sql) === TRUE) {
echo "Die Tabelle meineFreunde wurde erfolgreich erstellt";
} else {
echo "Fehler bei der Erstellung einer Tabelle: " . $verbindung->error;
}
$verbindung->close();
?>
Beispiel (MySQLi-prozedural)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Verbindungsaufbau
$verbindung = mysqli_connect($servername, $nutzer, $passwort, $dbname);
// Verbindungsprüfung
if (!$verbindung) {
die("Verbindung fehlgeschlagen: " . mysqli_connect_error());
}
/*
### Verbindungsblock Ende ###
*/
// SQL Erstellung einer Tabelle
$sql = "CREATE TABLE meineFreunde (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(30) NOT NULL,
nachname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
if (mysqli_query($verbindung, $sql)) {
echo "Die Tabelle meineFreunde wurde erfolgreich erstellt";
} else {
echo "Fehler bei der Erstellung von Tabelle: " . mysqli_error($verbindung);
}
mysqli_close($verbindung);
?>
Beispiel (PDO)
<?php
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDBPDO";
try {
$verbindung = new PDO("mysql:host=$servername;dbname=$dbname", $nutzer, $passwort);
// Setze den PDO-Fehlermodus auf Ausnahme
$verbindung->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL Erstellung einer Tabelle
$sql = "CREATE TABLE meineFreunde (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(30) NOT NULL,
nachname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
// Verwendung von exec(), da keine Ergebnisse zurückgegeben werden
$verbindung->exec($sql);
echo "Die Tabelle meineFreunde wurde erfolgreich erstellt";
} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
$verbindung = null;
?>
PHP MySQL Daten einfügen
Einfügen von Daten mit MySQLi und PDO in MySQL
Nachdem eine Datenbank und eine Tabelle erstellt wurden, kann man mit dem Hinzufügen von Daten beginnen.
Es folgen einige Syntaxregeln, die befolgt werden sollten:
- Die SQL-Abfrage muss innerhalb von PHP-Code in Anführungszeichen gesetzt werden
- Zeichenfolgenwerte innerhalb der SQL-Abfrage müssen in Anführungszeichen gesetzt werden
- Numerische Werte dürfen nicht in Anführungszeichen gesetzt werden
- Das Wort
NULL
darf nicht in Anführungszeichen gesetzt werden
Die INSERT INTO
-Anweisung wird verwendet, um neue Datensätze zu einer MySQL-Tabelle hinzuzufügen:
INSERT INTO table_name (spalte1, spalte2, spalte3,...)
VALUES (wert1, wert2, wert3,...)
Im vorherigen Teil haben wir eine leere Tabelle namens „meineFreunde“ mit fünf Spalten erstellt: „id“, „vorname“, „nachname“, „email“ und „reg_datum“. Nun befüllen wir die Tabelle mit Daten.
Hinweis: Wenn eine Spalte durch AUTO_INCREMENT (wie die Spalte „id“) oder TIMESTAMP mit der Standardaktualisierung von current_timesamp (wie die Spalte „reg_date“) aktualisiert wird, muss sie nicht in der SQL-Abfrage angegeben werden; MySQL fügt automatisch einen Wert hinzu.
Die folgenden Beispiele fügen der Tabelle „meineFreunde“ einen neuen Datensatz hinzu:
Beispiel (MySQLi objektorientiert)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Erstelle Verbindung
$verbindung = new mysqli($servername, $nutzer, $passwort, $dbname);
// Prüfe Verbindung
if ($verbindung->connect_error) {
die("Verbindung fehlgeschlagen: " . $verbindung->connect_error);
}
/*
### Verbindungsblock Ende ###
*/
$sql = "INSERT INTO meineFreunde (vorname, nachname, email)
VALUES ('Markus', 'Maier', 'markus@beispiel.de')";
if ($verbindung->query($sql) === TRUE) {
echo "Neuer Eintrag erfolgreich erstellt";
} else {
echo "Fehler: " . $sql . "<br>" . $verbindung->error;
}
$verbindung->close();
?>
Beispiel (MySQLi-prozedural)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Erstelle Verbindung
$verbindung = mysqli_connect($servername, $nutzer, $passwort, $dbname);
// Prüfe Verbindung
if (!$verbindung) {
die("Verbindung fehlgeschlagen: " . mysqli_connect_error());
}
/*
### Verbindungsblock Ende ###
*/
$sql = "INSERT INTO meineFreunde (vorname, nachname, email)
VALUES ('Markus', 'Maier', 'markus@beispiel.de')";
if (mysqli_query($verbindung, $sql)) {
echo "Neuer Eintrag erfolgreich erstellt";
} else {
echo "Fehler: " . $sql . "<br>" . mysqli_error($verbindung);
}
mysqli_close($verbindung);
?>
Beispiel (PDO)
<?php
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDBPDO";
try {
$verbindung = new PDO("mysql:host=$servername;dbname=$dbname", $nutzer, $passwort);
// Setzt den PDO-Fehlermodus auf Ausnahme
$verbindung->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO meineFreunde (vorname, nachname, email)
VALUES ('Markus', 'Maier', 'markus@beispiel.de')";
// Verwendet exec(), da keine Ergebnisse zurückgegeben werden
$verbindung->exec($sql);
echo "Neuer Eintrag erfolgreich erstellt";
} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
$verbindung = null;
?>
Aufgabe
- Erstelle eine Datenbank „leute“ und füge dieser die Tabelle „meineFreunde“ hinzu
- Es soll zusätzlich eine Spalte für das Alter geben
- Baue drei Eingabeformulare, welche die Werte „vorname“, „nachname“, „alter“ und „email“ übergeben
- Die dort eingegebenen Werte sollen in der Datenbank gespeichert werden
Daten mit PHP aus MySQL abrufen
Mit der SELECT
-Anweisung werden Daten aus einer oder mehreren Tabellen ausgewählt:
SELECT column_name(s) FROM table_name
oder man verwendet das *-Zeichen, um ALLE Spalten aus einer Tabelle auszuwählen:
SELECT * FROM table_name
Daten mit MySQLi auswählen
Im folgenden Beispiel werden die Spalten „id“, „vorname“ und „nachname“ aus der Tabelle „meineFreunde“ ausgewählt und auf der Seite angezeigt:
Beispiel (MySQLi objektorientiert)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Erstelle Verbindung
$verbindung = new mysqli($servername, $nutzer, $passwort, $dbname);
// Prüfe Verbindung
if ($verbindung->connect_error) {
die("Verbindung fehlgeschlagen: " . $verbindung->connect_error);
}
/*
### Verbindungsblock Ende ###
*/
$sql = "SELECT id, vorname, nachname FROM meineFreunde";
$ausgabe = $verbindung->query($sql);
if ($ausgabe->num_rows > 0) {
// Ausgabe der Daten jeder Spalte
while($spalte = $ausgabe->fetch_assoc()) {
echo "id: " . $spalte["id"]. " - Name: " . $spalte["vorname"]. " " . $spalte["nachname"]. "<br>";
}
} else {
echo "0 Ergebnisse";
}
$verbindung->close();
?>
Erläuterung der Codezeilen anhand des obigen Beispiels:
Zuerst wird eine SQL-Abfrage eingerichtet, die die Spalten „id“, „vorname“ und „nachname“ aus der Tabelle „meineFreunde“ auswählt. Die nächste Codezeile führt die Abfrage aus und fügt die resultierenden Daten in eine Variable namens $ausgabe ein.
Anschließend prüft die Funktion num_rows()
, ob mehr als null Zeilen zurückgegeben werden.
Wenn mehr als null Zeilen zurückgegeben werden, fügt die Funktion fetch_assoc()
alle Ergebnisse in ein assoziatives Array ein, das mit einer Schleife durchlaufen werden kann. Die while()
Schleife durchläuft die Ergebnismenge und gibt die Daten in den Spalten „id“, „vorname“ und „nachname“ aus.
Das folgende Beispiel zeigt dasselbe wie das obige Beispiel, jedoch auf die prozedurale Weise von MySQLi:
Beispiel (MySQLi-prozedural)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Erstelle Verbindung
$verbindung = mysqli_connect($servername, $nutzer, $passwort, $dbname);
// Prüfe Verbindung
if (!$verbindung) {
die("Verbindung fehlgeschlagen: " . mysqli_connect_error());
}
/*
### Verbindungsblock Ende ###
*/
$sql = "SELECT id, vorname, nachname FROM meineFreunde";
$ausgabe = mysqli_query($verbindung, $sql);
if (mysqli_num_rows($ausgabe) > 0) {
// Ausgabe der Daten jeder Spalte
while($spalte = mysqli_fetch_assoc($ausgabe)) {
echo "id: " . $spalte["id"]. " - Name: " . $spalte["vorname"]. " " . $spalte["nachname"]. "<br>";
}
} else {
echo "0 Ergebnisse";
}
mysqli_close($verbindung);
?>
Man kann das Ergebnis auch in eine HTML-Tabelle einfügen:
Beispiel (MySQLi objektorientiert)
<?php
/*
### Verbindungsblock Anfang ###
*/
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "meineDB";
// Erstelle Verbindung
$verbindung = new mysqli($servername, $nutzer, $passwort, $dbname);
// Prüfe Verbindung
if ($verbindung->connect_error) {
die("Verbindung fehlgeschlagen: " . $verbindung->connect_error);
}
/*
### Verbindungsblock Ende ###
*/
$sql = "SELECT id, vorname, nachname FROM meineFreunde";
$ausgabe = $verbindung->query($sql);
if ($ausgabe->num_rows > 0) {
echo "<table><tr><th>ID</th><th>Name</th></tr>";
// Ausgabe der Daten jeder Spalte
while($spalte = $ausgabe->fetch_assoc()) {
echo "<tr><td>".$spalte["id"]."</td><td>".$spalte["vorname"]." ".$spalte["nachname"]."</td></tr>";
}
echo "</table>";
} else {
echo "0 Ergebnisse";
}
$verbindung->close();
?>
Daten mit PDO ausgeben (+ vorbereitete Anweisungen)
Im folgenden Beispiel werden vorbereitete Anweisungen verwendet.
Es wählt die Spalten „id“, „vorname“ und „nachname“ aus der meineFreunde-Tabelle aus und zeigt sie in einer HTML-Tabelle an:
Beispiel (PDO)
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Vorname</th><th>Nachname</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$nutzer = "nutzername";
$passwort = "passwort";
$dbname = "myDBPDO";
try {
$verbindung = new PDO("mysql:host=$servername;dbname=$dbname", $nutzer, $passwort);
$verbindung->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $verbindung->prepare("SELECT id, vorname, nachname FROM meineFreunde");
$stmt->execute();
// Setzt das resultierende Array auf assoziativ
$ausgabe = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
} catch(PDOException $e) {
echo "Fehler: " . $e->getMessage();
}
$verbindung = null;
echo "</table>";
?>
Aufgabe
- Erweitere dein Programm um einen Button, der die Daten Deiner Datenbank auf einer neuen Seite ausgibt
- Welche Methode dabei verwendet wird, bleibt Dir überlassen
Übungsaufgaben
Übe das Verbinden, Erstellen, Befüllen und Abfragen von Datenbanken mit PHP