Verbindung zur Datenbank mit PHP (PDO) herstellen
Folien
Falls keine PDF-Präsentation zu sehen ist: Direktdownload der PDF-Präsentation
Es gibt zwei Möglichkeiten, wie Sie von PHP aus eine Verbindung zu einer (in unserem Fall: MySQL- oder MariaDB-)Datenbank herstellen:
- PDO
- mysqli
Wir verwenden PDO, da wir vielleicht gelegentlich von MySQL auf SQLite umsteigen; das macht uns die PDO-Abstraktionsschicht einfacher.
Vorgehen
Zuerst definieren wir die Zugangsdaten; dann stellen wir über einen PHP-Befehl eine Verbindung her; schließlich fangen wir mögliche Fehler ab.
Vorbemerkung
Den PHP-Code schreiben wir erst mal in die Seite, auf der das Formular eingebunden ist; später können wir das dann in andere Klassen auslagern.
<!DOCTYPE html> <html lang="de"> ...
<body>
<h1>Schülerwettbüro</h1>
<?php
$username = 'root'; ...
?>
<form action="index.php" method="post"> ...
...
</body>
</html>
Schritt 1: Zugangsdaten definieren
Wir brauchen:
Hostnamen / Servernamen (meistens: "localhost")
Name der Datenbank
Benutzername (bei lokalen Servern fast immer: "root")
Passwort (bei WAMP, xampp: "" (leer), bei MAMP: "root")
Am einfachsten speichern wir alle Zugangsdaten in Variablen; dann haben wir das an einer Stelle und können es bequem ändern/kontrollieren.
$servername = 'localhost'; $dbname = 'meineDatenbank'; $username = 'root';
$passwort = ''; // bei WAMP/xampp leer, bei MAMP (macOS) 'root'
Schritt 2: Verbindung zum Server herstellen
Erst mal fassen wir die bekannten Serverdaten zusammen. Wir wissen: 1. Es ist eine MySQL-Datenbank. 2. Wir kennen den Servernamen. 3. Wir kennen den Namen der Datenbank.
$servername = 'localhost';
$dbname = 'meineDatenbank';
$username = 'root';
$passwort = '';
$serverdaten = "mysql:host=$servername;dbname=$dbname";
Weitere Parameter sind möglich, bspw. um die Zeichenkodierung festzulegen, wenn es bspw. Probleme mit Umlauten gibt:
$serverdaten = "mysql:host=$servername;dbname=$dbname;charset=utf8";
Um die Verbindung zum Server zu öffnen, legen wir einfach ein neues Objekt der Klasse PDO ("PHP Data Objects") an, das (in unserem Fall) drei Parameter bekommt:
- Server- und DB-Daten
- Username
- Passwort
$verbindung; oft wird auch $pdo benutzt.
$verbindung = new PDO($serverdaten, $username, $passwort);
Schritt 3: Mögliche Fehler abfangen
Problem: Enthält der Verbindungsbefehl ($verbindung = new PDO…… // siehe oben) einen Fehler (z.B. falsches Passwort), bricht das Skript ab und wir erfahren nicht, welcher Fehler es war (falsches Passwort? Falscher Benutzername? Keine Verbindung zur Datenbank? Etc.).
Deshalb müssen wir den Fehler ab"fangen" (catch).
try { // PHP-Code }
catch(Exception $einFehler) { // PHP-Code }
Wir umgeben den Verbindungsaufbau also mit einem try-catch-Block: Probiere xy, wenn es einen Fehler gibt, fange den ab und mache was anderes.
try
{
$verbindung = new PDO($serverdaten, $username, $passwort);
// wenn hier ein Fehler "geworfen" wird, spuck uns keine Fehlermeldungen um die Ohren, sondern führe den catch-Block aus
}
catch(Exception $fehler)
// $fehler ist ein Objekt der Exception-Klasse. Exceptions enthalten genauere Informationen über den Fehler.
// eigentlich präziser: catch(PDOException $fehler)
{
print $fehler->getMessage(); // Ausgabe der Fehlermeldung
}
Übungen
Zusätzliche Dateien (Bilder, Klassendiagramme, HTML-Vorlagen) finden Sie in der Materialsammlung. Diese Übungen können Sie als txt-Datei herunterladen.
Übungen: PHP + MySQL - Verbindung zur Datenbank herstellen
Verbindung zur DB – fehlerhaftes Listing 1
Im folgenden Skript fehlen einige Anführungszeichen bzw. wurden falsch gesetzt. Fügen Sie sie ein und überprüfen Sie, ob es beim Ausführen des Skripts zu Fehlermeldungen oder Warnungen kommt.
$db_server = localhost; // Host-Name
$db_user = root; // Benutzername
"$db_pass" = root; // Kennwort
"$db_name" = sqltest; // Name der Datenbank
Verbindung zur DB – fehlerhaftes Listing 2
Finden Sie die drei Fehler im folgenden Skript. Überprüfen Sie, ob es beim Ausführen des Skripts zu Fehlermeldungen oder Warnungen kommt.
$username = 'root';
$passwort = 'root';
$host = localhost;
$db_name = 'wettdatenbank';
$serverdaten = "mysql:user=$username;password=$passwort";
$verbindung = new PDO($serverdaten, $username, $passwort);
try {
$verbindung = new PDO($serverdaten, $username, $passwort);
}
catch(Exception $fehler) {
print $fehler->getMessage();
}