Zum Inhalt springen
Der Guide für ein smartes Leben.
Der Datenturbo

MySQL mit PHP

Eine Adressverwaltung mit PHP 5 und MySQL ist ein typisches Beispiel für eine Datenbankanwendung im Internet: Daten werden geschrieben, gelesen, und auch verändert. Dieser Artikel zeigt alles auf einmal.

Autoren: Redaktion pcmagazin und Christian Wenz • 8.2.2008 • ca. 6:35 Min

MySQL mit PHP
MySQL mit PHP
© Archiv
Inhalt
  1. MySQL mit PHP
  2. Teil 4: MySQL mit PHP

Der Datenturbo Eine Adressverwaltung mit PHP 5 und MySQL ist ein typisches Beispiel für eine Datenbankanwendung im Internet: Daten werden geschrieben, gelesen, und auch verändert. Dieser Artikel zeigt alles auf einmal....

Der Datenturbo

Eine Adressverwaltung mit PHP 5 und MySQL ist ein typisches Beispiel für eine Datenbankanwendung im Internet: Daten werden geschrieben, gelesen, und auch verändert. Dieser Artikel zeigt alles auf einmal.

MySQL mit PHP
© Archiv

Viele Entwickler sind in Bezug auf die Datenbank, die sie im Web einsetzen, festgefahren. Es gibt einen speziellen Favoriten, der anscheinend konkurrenzlos ist. Und in der Tat hat jede relevante Datenbank irgendwelche Besonderheiten, die sie von der Konkurrenz abgrenzen.

Die Praxis zeigt jedoch, dass der Großteil der Datenbankanwendungen immer nach demselben Strickmuster verfährt: Daten werden eingefügt und dann angezeigt; unter Umständen können diese Daten dann auch noch bearbeitet, verschoben oder gar gelöscht werden. Es dreht sich im Grunde also alles um die vier SQL-Kommandos INSERT, SELECT, UPDATE und DELETE.

PHP macht es zudem den Entwicklern einfach, sich bei der Wahl der Datenbank an der Datenbank selbst zu orientieren und nicht an der Skriptsprache, denn PHP unterstützt fast jedes einigermaßen bekannte und verbreitete RDBMS (und auch einige Exoten). Dennoch ist MySQL meist die erste Wahl, vor allem wegen der Hoster-Situation.

Dieser Workshop implementiert eine Standard-Web-Anwendung mit PHP und MySQL. Der Augenmerk liegt hierbei auf PHP 5.x und dem damit möglichen OOP-Zugriff auf die (neue) MySQL-Erweiterung dieser PHP-Version, ext/mysqli.

Außerdem liegt ein weiterer Schwerpunkt des Workshops auf sicherer Programmierung: Daten werden also vor der Verarbeitung geprüft. Auch wenn das Anwendungsszenario, eine Kontaktdatenbank, primär für den Eigenbedarf geeignet ist und somit Sicherheit ein klein wenig in den Hintergrund rückt, ist der Einsatz von Best Practices generell bei der Programmierung eine gute Grundlage.

Installation

Die Beispiele in diesem Artikel benötigen ein funktionsfähiges PHP-System nebst MySQL-Datenbank. Eine der einfachsten Möglichkeiten, das einzurichten, besteht in der Verwendung eines All-in-One-Pakets wie XAMPP. Das gibt es unter anderem für Windows, Linux und Mac OS X und installiert alles, was Sie benötigen, auf dem Rechner: Die Skriptsprache PHP, die Datenbank MySQL, den Webserver Apache sowie zahlreiche zusätzliche Tools und Werkzeuge - inklusive phpMyAdmin! Wenn Sie Windows verwenden, gibt es mit dem Control Panel ein Administrationstool, um den Server und die Datenbank zu starten und zu stoppen. Nach erfolgreicher Installation und Start von Webserver und Datenbank (beides ist für das Beispiel erforderlich!) kommen Sie über https://localhost/ auf die XAMPP-Startseite.

MySQL mit PHP
Vielfalt ist Trumpf: XAMPP gibt es für sehr viele Betriebssysteme.
© Archiv

Einfach, aber funktional

Um das Beispiel übersichtlich zu halten, wird eine eher einfache Datenbankstruktur gewählt. Am besten legen Sie diese mit phpMy-Admin oder einem der anderen gezeigten Tools an. Bei XAMPP finden Sie phpMyAdmin bereits in die Web-Administrationsoberfläche integriert; der Link darauf ist im linken Navigationsframe.

Die Datenbank der Beispielanwendung heißt kontakte - auf der phpMyAdmin-Startseite finden Sie bereits den Bereich "Neue Datenbank anlegen", in dem Sie das erledigen können. Nach dem Anlegen einer Datenbank bietet phpMyAdmin direkt im Anschluss die Möglichkeit, eine Tabelle zu erstellen. In dieser Datenbank wird eine Tabelle namens kontakt angelegt, die alle Daten enthält. Wir benötigen dabei vier Felder (einen Wert, den phpMyAdmin ebenfalls abfragt).

Sie erhalten dann ein Formular, in dem Sie die vier Felder anlegen können. Neben den Feldnamen können Sie unter anderem noch den SQL-Datentyp für das Feld anlegen, also die Information, welche Art von Daten abgespeichert werden.

MySQL mit PHP
Unter Kontrolle: Die Tabelle kann mit phpMyAdmin bequem angelegt werden.
© Archiv

Das erste Feld erhält den Namen id. Darin speichern wir einen eindeutigen Bezeichner für das Feld, den wir an späterer Stelle in der Applikation noch benötigen werden. Den Typ setzen wir auf INT (Integer, also Ganzzahl), und bei Extra wählen wir den Eintrag auto_increment. Das sorgt dafür, dass MySQL automatisch dieses Datenbankfeld füllt, und zwar bei jedem neuen Eintrag in der Datenbank mit dem nächsten freien Wert: 1, 2, 3 und so weiter. Direkt neben dieser Einstellung finden Sie drei Radiobuttons; aktivieren Sie den ersten. Das legt fest, dass das aktuelle Feld der Primärschlüssel (eindeutige Bezeichner) der Tabelle ist, wie wir das ja auch geplant haben. Die restlichen drei Felder sind nicht mehr so aufwändig. Sie heißen vorname, nachname und email; als Datentyp verwenden wir VARCHAR (das steht für "Zeichenkette variabler Länge"). In der Spalte für die Länge geben wir für alle drei Felder 50 ein. Mit einem Klick auf Speichern wird die Tabelle dann angelegt. Wenn Sie ein anderes Tool als phpMyAdmin verwenden, müssen Sie die Anweisungen analog für die Software Ihrer Wahl bevorzugen. Möglicherweise gibt es dort die Möglichkeit, SQLKommandos an die Datenbank zu schicken. Der folgende Befehl legt die Tabelle kontakt an - die Datenbank kontakte muss dabei bereits existieren (oder Sie verwenden den Befehl CREATE DATABASE 'kontakte').

CREATE TABLE `kontakt` (
`id` INT NOT NULL AUTO_INCREMENT
?PRIMARY KEY ,
`vorname` VARCHAR( 50 ) NOT NULL ,
`nachname` VARCHAR( 50 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;

Schreiben

Zunächst soll es die Anwendung ermöglichen, Kontakte in der Web-Datenbank abzulegen. Dazu bedarf es zunächst einer simplen HTML-Eingabemaske:

<form method="post"
?action=""><table><thead><tr><th>Information</th>
?<th>Wert</th></tr></thead><tbody><tr><td>Vorname</td><td>
?<input type="text" name="vorname" />
?</td></tr><tr><td>Nachname</td><td><input
?type="text" name="nachname" />
?</td></tr><tr><td>E-Mail</td><td><input type=
?"text" name="email" /></td></tr></tbody></table><input type="submit" value="Kontakt
?anlegen" /></form>

Wird dieses Formular verschickt, prüft das PHP-Skript zunächst, ob überhaupt alle Daten übermittelt worden sind (wobei man diese Überprüfung auch ausführlicher gestalten könnte, etwa ob in allen Feldern auch etwas "Sinnvolles" drinsteht):

<?php
if (isset($_POST['vorname']) && is_
?string($_POST['vorname']) &&
isset($_POST['nachname']) && is_
?string($_POST['nachname']) &&
isset($_POST['email']) && is_
?string($_POST['email'])) {

Nur dann dürfen die Daten überhaupt eingetragen werden. Dazu wird zunächst die Verbindung zum MySQL-Server aufgebaut. Server, Benutzernamen und Passwort müssen Sie hier und in allen anderen Listings an Ihr System anpassen; wir verwenden hier den Standardnutzer von MySQL, root ohne Passwort (so beispielsweise von XAMPP vorkonfiguriert), was aber auf einem Produktivsystem nichts zu suchen hat:

try {
$db = new mysqli('localhost',
?'root', '');
$db->select_db('kontakte');

Nun kann es aber sein - und bei datenintensiven Anwendungen ist das sogar die Regel - dass Sie öfters innerhalb einer Seite eine Verbindung zur Datenbank aufbauen müssen. Das ist natürlich in gewisser Hinsicht eine Ressourcenverschwendung, denn es ist genauso gut möglich, eine bereits bestehende Verbindung wiederzuverwenden. Für genau diesen Fall gibt es eine Codevorlage, auch Entwurfsmuster genannt. Diese hört auf den Namen Singleton. Die Grundidee dahinter: Es soll nur eine Instanz eines Objekts geben. Der Code geht dabei wie folgt vor: Gibt es bereits eine Instanz, wird diese verwendet; andernfalls wird eine neue erzeugt. Das Ganze wird per PHP-Klasse erzeugt und kann so aussehen:

class Singleton {
static $db = null;
function holeVerbindung() {
if (self::$db == null) {
self::$db = new mysqli
?('localhost', 'root', '');
}
return self::$db;
}
}

Diese Klasse wird nun (nach Auslagerung in eine externe Datei und Einbau via require_once) verwendet und im nächsten Schritt gleich die Datenbank ausgewählt - eine MySQL-Instanz kann mehrere Datenbanken enthalten. Die Methode dafür heißt select_db().

$db = Singleton::
?holeVerbindung();
$db->select_db('kontakte');

Dann schickt das Skript die Kontaktdaten an die Datenbank. Dazu werden Prepared Statements verwendet, eine sehr performante und auch sichere Möglichkeit, Daten an den Server zu schicken. Der größte Vorteil: Um die Beseitigung gefährlicher Sonderzeichen in den Eingaben kümmert sich MySQL. Im PHP-Code bereiten Sie dazu eine SQL-Anweisung mit der prepare()-Methode vor; alle dynamischen Daten werden durch einen Fragezeichen-Platzhalter ersetzt.

$sql = $db->prepare('INSERT INTO
?kontakt (vorname, nachname, email)
?VALUES (?, ?, ?)');

Im zweiten Schritt binden Sie die einzelnen Werte an die Platzhalter. Die Syntax der Methode bind_param() ist etwas ungewöhnlich: Zunächst ein String mit den einzelnen Datentypen (s steht für String, i für Integer, und so weiter), dann die entsprechenden Werte als Referenzen:

$sql->bind_param('sss', $_POST
?['vorname'], $_POST['nachname'],
?$_POST['email']);

Die Methode execute() schickt dann die Anfrage an den Datenbankserver. Da jeder Eintrag in der Datenbank einen Autowert hat, ist es natürlich interessant zu wissen, welcher dies ist. Dazu gibt es die Eigenschaft insert_id, welche genau diese Informationen liefert:

if ($sql->execute()) {
$id = $db->insert_id;
echo 'Kontakt eingetragen (ID: ' .
?$id . ')!';
}

Wie allgemein üblich und auch empfehlenswert, kommt noch ein wenig Fehlerbehandlung dazu, und die Seite ist fertig.

MySQL mit PHP
Neu: Eine Adresse hinzufügen. Das ist die einfachste Form der Dateneingabe.
© Archiv