Praktisches Arbeiten mit einer PHP-Anwendung inkl. Zugriff auf die mySQL-Datenbank hier: Benutzerverwaltung Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Inhaltsverzeichnis, Seite I Inhaltsverzeichnis 1 Ziel ............................................................................................................................. 1 2 I. Teil der Planung und Konzeption - Theoretische Grundlagen ........................... 2 2.1 Konzeptionelle Modellierung: Abbildung der Realität im Entity-RelationshipModell (ER-Modell) ..................................................................................................... 2 2.2 Logische Modellierung: Umsetzung des ER-Modells in ein relationales Modell ........................................................................................................................ 2 2.3 Physische Modellierung: Übertragung des relationalen Modells in physische Strukturen, also Umsetzung in eine mySQL-Datenbank ............................ 2 2.4 Entwicklung der PHP-Anwendung: Zugriff auf die mySQL-Datenbank durch den Internet-Besucher ................................................................................................ 2 3 2.4.1 Sprachelemente von PHP ............................................................................... 3 2.4.2 PHP/MySQL-Schmittstellen (mysql, myqli, PDO) ............................................ 5 II. Teil der Planung und Konzeption - Praktische Umsetzung ............................... 8 3.1 Konzeptionelle Modellierung: Abbildung der Realität im Entity-RelationshipModell (ER-Modell) ..................................................................................................... 8 3.2 Logische Modellierung: Umsetzung des ER-Modells in ein relationales Modell ........................................................................................................................ 9 3.3 Physische Modellierung: Übertragung des relationalen Modells in physische Strukturen, also Umsetzung in eine mySQL-Datenbank ............................ 9 3.4 Entwicklung der PHP-Anwendung: Zugriff auf die mySQL-Datenbank durch den Internet-Besucher .............................................................................................. 10 3.4.1 Aufbau des Codes ........................................................................................ 10 3.4.2 Wichtige Codefragmente............................................................................... 11 4 Fazit und Ausblick .................................................................................................. 16 5 Verzeichnisse ........................................................................................................... 1 5.1 Literaturverzeichnis .................................................................................................... 1 5.2 Bildverzeichnis ........................................................................................................... 1 5.3 Anhang ....................................................................................................................... 2 Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 1 1 Ziel "Eine Benutzerverwaltung hat für den Betreiber einer Seite viele Vorteile. Mit der Registrierung wird eine Verbindung zwischen Website und User hergestellt. Dadurch erhöht sich die Wahrscheinlichkeit, dass der User die Seite erneut und vielleicht sogar regelmäßig besucht." (Landau, S. 1) Auch benötigt der Betreiber des Internetauftritts eine Benutzerverwaltung, wenn der Betreiber Teile seines Auftritts vor neugierigen Augen schützen will. (vgl. Wilfing und org 2005, S. 1) Ein autorisierter Benutzer darf also, erst nachdem er die korrekten Zugangsdaten angegeben hat, diese Webseiten öffnen. (vgl. Rupp 2009, S. 564) Diese Ausarbeitung zeigt, wie die PHP-Anwendung „Benutzerverwaltung“ entwickelt werden kann. Dabei werden die Anwenderdaten in einer MySQL-Datenbank abgelegt. Auf diese Daten wird dann mittels PHP zugegriffen. (PHP Hypertext Preprocessor) ist eine kostenlose Skriptsprache zur Webprogrammierung. MySQL ist ein kostenloses relationales DBMS (Datenbankmanagmentsystem). Die Entwicklung einer Benutzerverwaltung erfordert zahlreiche Arbeitsschritte, die im Folgenden beschrieben werden. Im I. Teil werden zunächst die theoretischen Grundlagen für die Planung und Konzeption der Benutzerverwaltung dargestellt. Die theoretischen Grundlagen der Planung und Konzeption werden im II. Teil in die Praxis für eine Benutzerverwaltung umgesetzt. Im zu beschreibenden Use-Case (= Anwendungsfall) werden folgende Vorgaben erarbeitet: Die Benutzerverwaltung kennt Rollen und Benutzer. Jeder Benutzer hat eine User-ID und ein Passwort mit dem er sich bei dem System anmeldet. Die Benutzerverwaltung erlaubt: 1) den Benutzer, mit Name, Vorname, E-Mail, Telefonnummer, Bild und einer User-ID sowie Passwort anzulegen. Das Passwort soll verschlüsselt sein. 2) jeden Benutzer eine Rolle mit Rechten zu zuweisen, so dass alle Benutzer mit den gleichen Rechte ausgestattet sind, die ihrer Rolle entspricht. Die möglichen Rechte sind vom Verfasser dieser Ausarbeitung bestimmt. Die Benutzer und Rollen sollen in einer MySQL Datenbank gespeichert werden. Für die Administrationsaufgabe wird Folgendes benötigt: 1) eine Eingabeseite um die Rollen und die einzelnen Benutzer einzugeben, 2) und eine Ausgabeseite mit verschiedenen Ansichten. Sicht 1: zu einer gewählten Rolle sollen alle Benutzer aufgelistet werden. Sicht 2: alle Benutzer und ihre Rollen sollen auflistet werden. Man kann die Liste nach Benutzer oder Rollen sortieren. Diese Ausarbeitung legt den Schwerpunkt auf die Beschreibung des Zugriffs mittels einer PHPAnwendung auf eine SQL-Datenbank. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 2 2 I. Teil der Planung und Konzeption - Theoretische Grundlagen Die Planung und Konzeption einer Benutzerverwaltung wird in Arbeitsschritte aufgeteilt, damit die Vorgehensweise klar und übersichtlich strukturiert wird. 2.1 Konzeptionelle Modellierung: Abbildung der Realität im Entity-Relationship-Modell (ER-Modell) "Nach der Erfassung und Analyse aller Anforderungen wird im nächsten Schritt mit Hilfe eines konzeptionellen Datenmodells ein konzeptionelles Schema für die Datenbank erstellt. [...] Das konzeptionelle Schema ist eine kompakte Beschreibung der Datenanforderungen der Benutzer und beinhaltet ausführliche Beschreibungen der Entitätstypen, Beziehungen und Einschränkungen." (Elmasri und Navathe 2009, S. 58) 2.2 Logische Modellierung: Umsetzung des ER-Modells in ein relationales Modell "Der nächste Schritt im Datenbankentwurf ist die eigentliche Implementierung der Datenbank unter Verwendung eines kommerziellen DBMS (Datebankmanagementsystem). Die meisten heute angebotenen kommerziellen DBMS verwenden ein Implementierungsdatenmodell, z. B. das relationale oder Objekt-Datenbankmodell, [...]. Dieser Schritt wird als logischer Entwurf bezeichnet [...]." (Elmasri und Navathe 2009, S. 60) 2.3 Physische Modellierung: Übertragung des relationalen Modells in physische Strukturen, also Umsetzung in eine mySQL-Datenbank "Am Beginn jeder Datenbankanwendung steht das Design der Datenbank [..], also die Umsetzung des relationalen Modells in eine mySQL-Datenbank. Fehler, die in der Designphase begangen werden, lassen sich später nur mit sehr großem Aufwand korrigieren." (Kofler und Öggl 2010, S. 307) Zum konkreten Erzeugen von Datenbanken und Tabellen gibt es zwei Möglichkeiten. "Am komfortabelsten ist es, eine Benutzeroberfläche wie phpMyAdmin einzusetzen. [...] Die andere Variante besteht darin, Datenbanken und Tabellen durch entsprechende SQL-Kommandos zu erzeugen (z. B. CREATE TABLE name, [...] …)." (Kofler und Öggl 2010, S. 307) 2.4 Entwicklung der PHP-Anwendung: Zugriff auf die mySQL-Datenbank durch den Internet-Besucher "Die Programmiersprache PHP wurde entwickelt, um statische HTML-Seiten mit Programmierlogik aufwerten zu können. [...] Die PHP-Funktionen werden als Teil des Webservers geladen (als Modul) und werden daher direkt im Kontext des Webserver-Prozesses zur Ausführung gebracht. Der dabei erzielte Geschwindigkeitsvorteil ist, vor allem bei viel frequentierten Seiten, enorm." (Kofler und Öggl 2010, S. 81) Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 3 2.4.1 Sprachelemente von PHP "Die Syntax von PHP ist ein wenig an die anderer Sprachen angelehnt, wie z. B. C, Shellscript, Perl und sogar Java. Es ist in der Tat eine Mischsprache, die die besten Funktionen aus anderen Sprachen nimmt und sie zu einer einfach verwendenden und leistungsfähigen Scriptsprache verbindet." (Gutmans et al. 2005, S. 55) Folgende Themen bilden die Grundlagen von PHP: 2.4.1.1 HTML-Einbettung Ein PHP-Code beginnt mit dem PHP-Tag <?php und endet mit dem PHP-Tag ?>. Diese Tags werden in den HTML-Code eingebettet. (vgl. Gutmans et al. 2005, S. 56) "Die Besonderheit von PHP besteht darin, dass der Programmcode direkt in das HTML-Dokument eingebettet wird. HTML- und PHP-Code befinden sich also in derselben Datei, wobei die PHPTaiel natürlich speziell markiert sind." (Kofler und Öggl 2010, S. 79) 2.4.1.2 Kommentare Kommentare können z. B. wie in C++ verfasst werden: "// Dies ist ein C++-artiger Kommentar, der am Zeilenende endet." (Gutmans et al. 2005, S. 56) 2.4.1.3 Variablen Variablen müssen vor der Verwendung nicht deklariert werden; es muss also nicht der Typ angegeben werden. Somit kann eine Variable ihren Typ ändern so oft dies gewollt wird. Variablen steht ein $-Zeichen voran und können mit einem Buchstaben oder einem Unterstrich beginnen. Beispiele: $count, $_Obj, $A123 PHP unterstützt keine globalen Variablen. Variablen sind in ihrem Geltungsbereich lokal, und wenn sie in einer Funktion erstellt werden, sind sie nur während der Lebensdauer der Funktion verfügbar. Im Hauptscript (nicht innerhalb einer Funktion) erstellte Variablen sind keine globalen Variablen; diese werden nicht in Funktionen angezeigt. Man kann aber unter Verwendung eines speziellen Arrays $GLOBALS[] auf sie zugreifen, indem der Namen der Variablen als String-Index verwendet wird. $PI = 3.14; $radius = 5; $circumference = $GLOBALS[„PI“] * 2 * $GLOBALS[„radius“]; // Circumference = n * d (vgl. Gutmans et al. 2005, S. 57–58) Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 4 2.4.1.4 Variable Variablen Variablen können zur Laufzeit über den Namen erstellt und auf sie zugegriffen werden, Beispiel: $name = „John“; $$name = „Registered user“; print $John; Dieser Code gibt »Registered user« aus. (vgl. Gutmans et al. 2005, S. 58) 2.4.1.5 Umgang mit Variablen Für den Umgang mit Variablen gibt es drei Sprachfunktionen. isset() isset() überprüft, ob eine bestimmte Variable von PHP deklariert wurde. Wurde die Variable be- reits gesetzt, gibt die Funktion den Wert true zurück, andernfalls, oder wenn die Variable den Wert NULL hat, false. unset() unset() macht die Deklaration einer Variablen rückgängig und gibt allen genutzten Speicher frei, sofern keine andere Variable den Wert referenziert. Ein Aufruf von isset() auf eine Variable, auf die zuvor unset() angewendet wurde, ergibt false. emty() emty() kann verwendet werden, um zu überprüfen, ob eine Variable nicht deklariert wurde oder ihr Wert false ist. Normalerweise prüft es, ob eine Formularvariable nicht gesendet wurde oder keine Daten enthält. (vgl. Gutmans et al. 2005, S. 59–60) 2.4.1.6 Superglobale Arrays Als allgemeine Regel gilt, dass PHP keine globalen Variablen unterstützt (Variablen, auf die automatisch aus jedem Bereich zugegriffen werden kann). Bestimmte spezielle interne Variablen, die Superglobals heißen und vordefiniert sind, verhalten sich jedoch ähnlich wie globale Variablen anderer Sprachen; Beispiele: $_GET[] // Ein Array, das alle GET-Variablen enthält, die PHP vom Browser des Clients erhalten hat. $_POST[] //Ein Array, das alle POST-Variablen enthält, die PHP vom Browser des Clients erhalten hat. $_Cookie[] Ein Array, das alle Cookies, die PHP vom Browser des Clients erhalten hat. (vgl. Gutmans et al. 2005, S. 60) Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 5 Eine weitere Beschreibung dieser und anderer Superglobals würde an dieser Stelle zu weit führen. 2.4.1.7 Grundlegende Datentypen In PHP gibt es acht verschiedene Datentypen. Fünf davon sind skalar, und die restlichen haben jeweils ihre Besonderheit. Die zuvor behandelten Variablen können Werte aller dieser Datentypen enthalten, ohne dass ihr Typ explizit deklariert werden muss. Das Verhalten der Variablen ergibt sich aus dem Datentyp, den sie enthält. (vgl. Gutmans et al. 2005, S. 61) Eine detaillierte Beschreibung der Datentypen Ganzzahlen, Fließkommazahlen, Strings, Bool´sche Werte, NULL, Resources, Arrays und Konstanten würde an dieser Stelle den Rahmen die Ausarbeitung sprengen. 2.4.1.8 Operatoren "In PHP gibt es drei Arten von Operatoren: Unär- und Binäroperatoren sowie einen Ternäroperator" (Gutmans et al. 2005, S. 74) Auf Operatoren soll an dieser Stelle nicht weiter eingegangen werden. 2.4.1.9 Kontrollstrukturen Steuerstrukturen können in zwei Gruppen eingeteilt werden: Bedingte Steuerung und Steuerung von Schleifen. Die bedingte Steuerung beeinflusst den Ablauf des Programms und führt bestimmten Code aufgrund gewisser Kriterien aus der überspringt ihn, wohingegen die Steuerung von Schleifen bewirkt, dass ein bestimmter Code gemäß angegebener Kriterien beliebig oft ausgeführt wird. (vgl. Gutmans et al. 2005, S. 82) Eine genauere Darstellung der Kontrollstrukturen würde an dieser Stelle zu weit führen. 2.4.1.10 Funktionen "Eine Funktion in PHP kann eingebaut oder benutzerdefiniert sein; beide werden jedoch auf dieselbe Art aufgerufen." (Gutmans et al. 2005, S. 91) Weiter soll auf dieses Thema nicht eingegangen werden. 2.4.2 PHP/MySQL-Schmittstellen (mysql, myqli, PDO) Für den Zugriff in PHP-Code auf die MySQL-Datenbanken stehen momentan drei Schnittstellen zur Wahl: – "mysql: Die mysql-Funktionen sind vielen PHP-Programmieren aus älteren PHP-Versionen bekannt. – mysqli: Ab PHP 5.0 ermöglicht die objektorientierte Schnittstelle myqli eine elegantere Programmierung und gibt Zugang zu einigen neunen MySQL-Funktionen (z. B. die besonders effiziente Ausführung von SQL-Komandos mit Parametern durch sog. Prepared Statements). – pdo: Ab PHP 5.1 kann PHP mit MySQL auch über die PHP DAT Objects (PDO) kommunizieren. Dabei handelt es sich um eine Erweiterung für den einheitlichen Zugriff auf unterschiedliGunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 6 che Datenbanken. Diese Schnittstelle ist nicht MySQL-spezifische, sondern kann auch für andere Datenbanksysteme verwendet werden. Allerdings hat sich PDO zumindest im Zusammenspiel mit MySQL nicht durchsetzen können. (vgl. Kofler und Öggl 2010, S. 407) 2.4.2.1 mysql-Funktionen "Die mysql-Funktionen sind kein integraler Bestandteil von PHP, sondern eine Erweiterung." (Kofler und Öggl 2010, S. 409) Deshalb müssen diese Funktionen unter Linux bzw. Windows zunächst integriert bzw. deren Aktivierung überprüft werden. 2.4.2.1.1 Verbindungsaufbau Der Verbindungsaufbau wird mit mysql_connect ausgeführt. Dabei werden 1. der Rechnernahmen (Hostenamen) des MySQL-Servers 2. der MySQL-Benutzer 3. und das Passwort übergeben, z. B. $conn = mysql_connect("localhost", "username", "xxx"); In diesem Beispiel (Rechnername = localhost) läuft MySQL und das PHP-Skript auf demselben Rechner. (vgl. Kofler und Öggl 2010, S. 410) 2.4.2.1.2 SQL-Kommandos ausführen Um SQL-Kommandos auszuführen, werden diese als Zeichenkette an die Funktion mysql_query übergeben. Dabei kann mit mysql_query jede Art von SQL-Kommando ausgeführt werden - Abfragen mit SELECT, Veränderungen an den Daten mit INSERT, UPDATE und DELETE, etc. Beispiel: $result = mysql_query("SELECT COUNT (*) FROM titles"); (vgl. Kofler und Öggl 2010, S. 411) 2.4.2.1.3 SELECT-Ergebnisse auswerten Bei der Ausführung einer SELECT-Abfrage mit mysql_query wird als Ergebnis ein Verweis auf eine Tabelle mit rows Zeilen und cols Spalten erzeugt: $result = mysql_query(SELECT * FROM titles"); $rows = mysql_num_rows($result); $cols = mysql_num_fields($result); Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 7 Der Zugriff auf die einzelnen Felder der Tabelle kann so erfolgen: 1. einfach aber langsam $item = mysql_result($result, $row, $col); 2. effizienter: Auswertung zeilenweise – $mysql_fetch_row (liefert einfachen Array) – $mysql_fetch_array (liefert assoziativen Array) – $mysql_fetch_assoc (liefert assoziatives Feld) – $mysql_fetch_object (liefert Objekt; der Zugriff auf die Spalten erfolgt mit $row->colname). (vgl. Kofler und Öggl 2010, S. 412–416) 2.4.2.1.4 Transaktionen "Es gibt keine Funktionen zur Steuerung von Transaktionen." (Kofler und Öggl 2010, S. 416) 2.4.2.1.5 Fehlerabsicherung und Fehlersuche Alle mysql_xxx-Funktionen liefern FALSE als Ergebnis, wenn es bei der Ausführung zu einem Fehler gekommen ist. Informationen über die Art des Fehlers liefert die Auswertung der Funktionen mysql_errno (liefert eine Fehlernummer) und mysql_error (Fehlermeldung). "Manche mysql-Funktionen schreiben selbst Fehlermeldungen in die HTML-Ausgabe. (vgl. Kofler und Öggl 2010, S. 416) Die Fehlersuche gestaltet sich also als sehr schwierig und erfordert viel Geduld. 2.4.2.2 mysqli-Klassen, -Methoden und – Eigenschaften "Die mysqli-Schnittstelle ermöglicht eine objektorientierte Programmierung des Datenbankzugriffs auf MySQL und ist damit eine wichtige Hilfe auf dem Weg zu einem übersichtlicheren Code." (Kofler und Öggl 2010, S. 417) Weitere Ausführungen zu diesem Thema würden allerdings in dieser Ausführung allerdings zu weit führen. Insbesondere weil der praktische Teil mittels der o. g. mysql-Schnittstelle und nicht über mysqli auf die Datenbank zugreift. 2.4.2.3 PHP Data Objects (PDO) "Die PHP Data Objects (kurz PDO) erlauben einen objektorientierten Zugriff auf diverse Datenbanksysteme." (Kofler und Öggl 2010, S. 430) Wie bereits erwähnt wird diese Art von Zugriff auf die Datenbank nicht im praktischen Teil verwendet. Deshalb wird auf eine weitere Beschreibung an dieser Stelle verzichtet. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 8 3 II. Teil der Planung und Konzeption - Praktische Umsetzung Mit Hilfe der theoretischen Grundlagen wird in diesem praktischen Teil eine Benutzerverwaltung erstellt. Als Grundlage dieser Benutzerverwaltung wurde das PHP Loginsystem, das von der URL http://www.mywebsolution.de/workshops/2/show_PHP-Loginsystem.html heruntergeladen werden kann, verwendet. Im Folgenden werden nur die Bereiche beschrieben, die vom Autor dieser Ausarbeitung selbst angefertigt bzw. geändert wurden. 3.1 Konzeptionelle Modellierung: Abbildung der Realität im Entity-Relationship-Modell (ER-Modell) Zunächst wurde folgendes ER-Modell erstellt: ID Benutzername Passwort Registrierungsdatum Vorname Nachname Benutzer Autologin n E-Mail IP Hat Rolle Telefonnummer SessionID Bild Letzter Login ID_Rolle Letzte Aktion Rollenname 1 n Hat Recht Rechtename Abbildung 1: ER-Modell für Benutzerverwaltung Die Benutzerverwaltung kennt also Rollen und Benutzer. Jeder Benutzer hat eine ID und ein Passwort mit dem er sich bei dem System anmeldet. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 9 Die Benutzerverwaltung erlaubt: 1) den Benutzer, mit Name, Vorname, E-mail, Telefonnumer, Bild und einer ID sowie Passwort anzulegen. 2) jeder Benutzer eine Rolle mit Rechten zu zuweisen, so dass alle Benutzer mit den gleichen Rechte ausgestattet sind, die ihrer Rolle entspricht. 3.2 Logische Modellierung: Umsetzung des ER-Modells in ein relationales Modell Aus dem ER-Modell ist folgendes rationale Modell erstellt worden: User (ID, Autologin, IP, SessionID, Benutzer, Passwort, Email, Vorname, Registrierungsdatum, Nachname, Telefonnummer, Bild, Letzter_Login, Letzte_Aktion, ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ user_rollen (ID_Rolle, Rollenname, ⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ ID_Rolle ) ID ) rollen_rechte (ID, Rechte) Das Attribut ID_Rolle der Relation user_rollen ist also bei der Relation user im Attribut Rolle als Fremdschlüssel eingetragen. Das Attribut ID der Relation rollen_rechte ist bei der Relation user_rollen im Attribut Recht als Fremdschlüssel eingetragen. Dadurch wird sichergestellt, dass jedem User, dessen Daten in einer Tupel abgelegt sind, immer nur eine Rolle zugeordnet werden kann. Auch wird jeder Rolle immer nur ganz bestimmte Rechte zugewiesen. Damit ist die referenzielle Integrität gewahrt: "Die Einschränkung bzw. Bedingung der referenziellen Integrität wird zwischen zwei Relationen definiert und dient der Wahrung der Konsistenz zwischen den Tupeln zweier Relationen. Informell besagt die referenzielle Integrität, dass ein Tupel der Relation, auf die sich ein Tupel einer anderen Relation bezieht, existieren muss." (Elmasri und Navathe 2009, S. 144) 3.3 Physische Modellierung: Übertragung des relationalen Modells in physische Strukturen, also Umsetzung in eine mySQL-Datenbank Aus dem relationalem Modell wird über die Oberfläche von phpMyAdmin eine MySQL-Datenbank mit folgender Struktur erstellt: Abbildung 2: Struktur der SQL-Datenbank Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 10 Dafür wurden über die SQL-Befehle CREATE TABLE die drei Tabellen angelegt und über INSERT INTO mit Daten gefüllt. Im Anhang in der Datei benutzerverwaltung.sql befinden sich die vollständigen Befehle zum Erstellen der Datenbank. Eine genaue Beschreibung der notwendigen SQL-Befehle ist nicht Schwerpunkt dieser Ausarbeitung. 3.4 Entwicklung der PHP-Anwendung: Zugriff auf die mySQL-Datenbank durch den Internet-Besucher 3.4.1 Aufbau des Codes Der Code verteilt sich auf die folgenden Dateien: autologaus.php automatisches Ausloggen functions.php* Funktionen: Wortlänge prüfen, User ausloggen, … index.php* Startseite login.php* Login-Seite logout.php Seite nach dem Ausloggen myprofil.php* Seite zum Ändern des Profil durch den Benutzer mysql.php* Verbindung mit localhost passwort.php* Seite „Passwort vergessen“ profil.php* Anzeige der Daten eines Benutzers registrierung.php* Registierungsformular userliste.php* Benutzerliste admin/index.php* Adminbereich admin/user/index.php* Prüfung, ob Benutzer Adminbereich betreten darf admin/user/edit.php** Benutzer ändern und Rolle zuweisen admin/user/delete.php* Benutzer löschen admin/user/rolle.php*** Nach Auswahl einer Rolle werden die Benutzer angezeigt admin/user/benutzerrollen.php*** Liste der Benutzer mit dazugehörigen Rollen, die sich nach Rollenname oder Benutzername sortieren lassen. * Diese Dateien wurden vom Autor so verändert, dass die Attribute der Relationalen Datenbank angezeigt werden. Außerdem wurden die Texte und Links verändert. ** Diese Datei wurde vom Autor so ergänzt, dass auch die Rollen zugewiesen werden können. *** Diese Dateien wurden vom Autor erstellt. Wie bereits oben erwähnt, soll im Folgenden nur auf die vom Autor erstellten Dateien eingegangen werden, um zu zeigen, wie der Zugriff einer PHP-Anwendung auf eine SQL-Datenbank erfolgen kann. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 11 3.4.2 Wichtige Codefragmente Der Benutzer, der für diesen Adminbereich zugelassen ist, kann die Seite admin/index.php aufrufen: Abbildung 3: Auswahlmöglichkeiten im Adminbereich Dort kann er über über den Link Rolle -> Benutzer die Datei rolle.php bzw. über Rollen und Benutzer die Datei benutzerrollen.php aufgerufen. Diese beiden Dateien werden im Folgenden beschrieben. 3.4.2.1 Benutzer einer ausgewählten Rolle anzeigen (rolle.php) Der Code dieser Seite ist in zwei Bereiche unterteilt. Die beiden Teile werden durch eine IF-/ELSEAnweisung getrennt (siehe auch Kapitel „2.4.1.9 Kontrollstrukturen“). Dabei wird immer erst der 2. Bereich dargestellt, weil die Bedingung des 1. Bereichs erst durch den 2. Bereich erfüllt werden kann. Dies bedeutet konkret: erst wenn im 2. Bereich über einen Button die $post-Werte (siehe auch Kapitel „2.4.1.6 Superglobale Arrays“) der ID_Rolle abgeschickt wurden, wird der 1. Bereich angezeigt. Die beiden Code-Bereiche sind wie folgt aufgebaut: 2. Code-Bereich: ELSE-Anweisung Durch den 2. Teil erhält der Administrator die Möglichkeit eine Rolle auszuwählen, für die er sich die dazugehörigen Benutzer anzeigen lassen möchte: Abbildung 4: Adminbereich - Rolle auswählen Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 12 Dieser 2. Bereich wird wie bereits erwähnt mit der ELSE-Anweisung eingeleitet. Danach wird eine SELECT-Anfrage (siehe auch Kapitel „2.4.2.1.2 SQL-Kommandos ausführen“) an die Datenbank gestartet. Dabei werden aus der Tabelle user_rollen die Werte der Spalten ID_Rolle und Rollenname abgefragt. Das Ergebnis wird in $result (siehe auch Kapitel „2.4.1.3 Variablen“) gespeichert. Danach wird mit einer IF/ELSE-Anweisung unterschieden, ob Daten vorhanden sind oder nicht. Falls keine Daten vorhanden sind (Abfrage über den Befehl: !mysql_num_rows($result)) („siehe auch Kapitel 2.4.2.1.3 SELECT-Ergebnisse auswerten“), wird mit echo „Es befinden sich keine Rollen in der Datenbank“ ausgeben. Falls Daten vorhanden sind, wird ein Formular (Befehl <form>) mit dem ersten Eintrag (Anweisung: <option value\“0>) „Bitte eine Rolle auswählen“ angezeigt. Die Zeilen-Werte (Anweisung $row) aus der Datenbank werden über den Befehl $row = mysql_fetch_assoc ($result) (siehe auch Kapitel „2.4.2.1.3 SELECT-Ergebnisse auswerten“) ge- holt. Dabei ist es wichtig, dass ein assoziatives Feld geliefert wird, da ansonsten die Werte der Felder nicht als Arrays vorliegen (siehe auch Kapitel „2.4.2.1.3 SELECT-Ergebnisse auswerten“). Die Anzeige der Werte erfolgt dann über das Auswahlmenü $row['Rollenname']. Den Abschluss bildet ein Button mit dem Typ "submit" und dem Wert "Rolle auswählen" mit ID_Rolle, der dann im 1. Code-Bereich weiterverarbeitet wird. 1. Code-Bereich: IF-Anweisung Durch den 1. Code-Bereich erhält der Anwender eine Aufstellung der Benutzer für die vorher ausgewählte Rolle: Abbildung 5: Darstellung der Benutzer einer bestimmten Rolle Wie bereits oben erwähnt, wird das im 2. Code-Bereich beschriebene Formular durch die ELSEAnweisung nur angezeigt, wenn der Benutzer noch keine Auswahl getroffen hat. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 13 Trifft er eine Auswahl wird über zwei verschachtelte IF-Anweisungen festgelegt, dass der gesendete Wert beim Drücken des Buttons "Rolle auswählen" die ID_Rolle ist: if(isset($_POST['ID_Rolle']) AND $_POST['ID_Rolle'] != 0) { if(isset($_POST['submit']) AND $_POST['submit'] == 'Rolle auswählen'){ … (zu isset() siehe auch Kapitel „2.4.1.5 Umgang mit Variablen“) Es wird eine Tabelle über <table> geöffnet. Für diese Tabelle werden über eine SELECTAnweisung die Daten ID, user.Benutzer, user.Rolle, user_rollen.ID_Rolle, user_rollen.Rollenname aus den beiden Tabellen user und user_rollen geholt, bei denen die Werte von den Spalten Rolle und ID_Rolle beim gesendeten Wert ($_POST['ID_Rolle']) übereinstimmen: WHERE Rolle = '".mysql_real_escape_string($_POST['ID_Rolle'])."' AND ID_Rolle = '".mysql_real_escape_string($_POST['ID_Rolle'])."' Das Ergebnis wird in $result hinterlegt. Die Zeilen-Werte ($row) aus der Datenbank werden wieder über den Befehl $row = mysql_fetch_assoc ($result) geholt. Die Anzeige der Werte erfolgt diesmal über $row['Benutzer']; es werden also die Benutzer in der oben begonnenen Tabelle angezeigt. 3.4.2.2 Benutzer einer ausgewählten Rolle anzeigen (benutzerrolle.php) Auf die Verweise auf den theoretischen Teil wird im Folgenden verzichtet, da die Datei benutzerrolle.php die gleichen theoretischen Grundlagen wie die oben beschriebene Datei rolle.php ver- wendet. Diese Seite wird im Adminbereich durch den Link Rollen und Benutzer aufgerufen. Dabei wird eine Liste aller Benutzer mit ihrer jeweiligen Rolle angezeigt. Diese kann der Benuter über einen Knopf Nach Rollenname sortieren: Abbildung 6: Anzeige der Benutzer mit jeweiliger Rolle sortiert nach Benutzer Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 14 Danach kann er die Benutzer und ihre jeweiligen Rollen Nach Benutzer sortieren, oder wieder nach Rollenname, usw.: Abbildung 7: Anzeige der Benutzer mit jeweiliger Rolle sortiert nach Rollename Diese Datei benutzerrolle.php ist in drei Code-Bereiche durch eine IF-/ELSEIF-/ELSE-Anweisung aufgeteilt. Dabei gibt der 3. Bereich die Bedingungen für den 1. Bereich vor, der wiederum die Bedingung für den 2. Bereich vorgibt. Es wird also beim Einstieg auf die Seite zunächst der 3. Bereich angezeigt. Klickt der Benutzer auf Nach Rollenname sortieren ist die Bedingung für den 1. Bereich erfüllt, der dann angezeigt wird. Klickt der Benutzer hier im 1. Bereich auf Nach Benutzer sortieren, ist die Bedingung für den 2. Bereich erfüllt. Somit wird der 2. Bereich angezeigt. Im 2. Bereich kann der Benutzer auf Nach Rollenname sortieren klicken. Dadurch ist wieder die Bedingung des 1. Bereichs erfüllt, der dann wieder angezeigt wird. Durch diese drei Bereiche ist es dem Benutzer möglich, wahlweise die Daten entweder nach Rollenname oder nach Benutzer zu sortieren. Nun zur genaueren Darstellung des Aufbaus der drei Bereiche: 3. CODE-Bereich: ELSE-Anweisung Der 3. Bereich wird wie bereits oben erwähnt beim Einstieg auf diese Seite angezeigt. Er beginnt mit einem Button Nach Rollenname sortieren (Anweisung: <form …>). Im Gegensatz zum Code in der Datei rolle.php wird beim Klicken auf den Button nicht ein Wert aus der Datenbank weiter gegeben, sondern ein Text (Anweisung: value=\"Nach Rollenname sortieren\). Außerdem wird eine Tabelle (Anweisung <table>) erstellt. Die Daten der Tabelle werden über eine SELECT-Anweisung aus der Datenbank abgefragt, wobei die WHERE-Anweisung Rolle = ID_Rolle sicherstellt, dass nur die Zeilen aus den Tabellen user und user_rollen ausge- wählt werden, bei denen die Werte von Rolle und ID_Rolle identisch sind. Diese Daten sind über die Anweisung ORDER BY user.Benutzer ASC nach den Benutzernamen sortiert. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 15 Das Ergebnis wird in $result hinterlegt. Die Zeilen-Werte ($row) aus der Datenbank werden wieder über den Befehl $row = mysql_fetch_assoc ($result) geholt. Die Anzeige der Werte erfolgt diesmal in der einen Spalte der Tabelle über $row['Benutzer'] und in der anderen Spalte über $row['Rollenname']; es werden also die Benutzer und die jeweiligen Rollennamen in der oben be- gonnenen Tabelle angezeigt. 1. CODE-Bereich: IF-Anweisung Klickt der Benutzer auf den im 3. Code-Bereich beschriebenen Button Nach Rollenname sortieren, erfüllt dieser Wert im 1. Code-Bereich die IF-Anweisung: if(isset($_POST['submit']) AND $_POST['submit'] == 'Nach Rollenname sortieren') { … Es wird also der nachfolgende Code des 1. Bereichs ausgeführt. Dieser ist wieder analog dem 3. Bereich aufgebaut. Mit zwei Ausnahmen: 1. Das zuerst aufgeführte Formularfeld zeigt und verschickt den Wert Nach Benutzer sortieren. 2. Die SELECT-Anfrage sortiert jetzt nach den Rollennamen: ORDER BY user_rollen.Rollenname ASC. Es werden durch die SELECT-Anfrage also alle Benutzer mit den dazugehörigen Rollennamen sortiert nach den Rollennamen in einer Tabelle angezeigt. 2. CODE-Bereich: ELSEIF-Anweisung Klickt der Benutzer im 1. Code-Bereich auf den Button Nach Benutzer sortieren, erfüllt dieser Wert im 2. Code-Bereich die ELSEIF-Anweisung: elseif(isset($_POST['submit']) AND $_POST['submit'] == 'Nach Benutzer sortieren') {… Es wird also der nachfolgende Code des 2. Bereichs ausgeführt. Dieser ist wieder analog dem 1. Bereich aufgebaut. Mit zwei Ausnahmen: 3. Das zuerst aufgeführte Formularfeld zeigt und verschickt den Wert Nach Nach Rollenname sortieren. 4. Die SELECT-Anfrage sortiert jetzt nach den Benutzernamen: ORDER BY user.Benutzer ASC. Es werden durch die SELECT-Anfrage also alle Benutzer mit den dazugehörigen Rollennamen sortiert nach den Benutzernamen in einer Tabelle angezeigt. Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 16 4 Fazit und Ausblick Die PHP-Anwendung für die Benutzerverwaltung wurde auf der Grundlage einer MySQLDatenbank wie folgt erstellt: - Konzeptionelle Modellierung: Abbildung der Realität in Entity-Relationship-Modell (ERModell) - Logische Modellierung: Umsetzung des ER-Modells in ein relationales Modell - Physische Modellierung: Übertragung des relationalen Modells in physische Strukturen, also Umsetzung in eine mySQL-Datenbank - Entwicklung der PHP-Anwendung: Zugriff auf die mySQL-Datenbank durch den InternetBesucher (Schwerpunkt dieser Ausarbeitung) Die vorliegende Benutzerverwaltung ermöglicht, eine Anwendung vor neugierigen Augen nicht registrierter Benutzer zu schützen. Die Benutzer können sich mit Vornamen, Nachnamen, E-Mail, Bild und weiteren Daten in die SQL-Datenbank über eine PHP-Anwendung eintragen. Der Administrator kann die Benutzer verwalten und ihnen Rollen mit Rechten zuweisen. Außerdem stehen ihm Sichten für die Anzeige der Benutzer einer zuvor ausgewählten Rolle sowie einer Tabelle mit den Benutzer und ihren dazugehörigen Rollen, die nach Benutzer oder Rollen sortiert werden kann, zur Verfügung. An Hand dieser beiden Sichten (rolle.php und rollenbenutzer.php) wird in dieser Ausarbeitung der Zugriff der PHP-Anwendung auf die SQL-Datenbank beschrieben. Der lauffähige Quellcode dieser Ausarbeitung befindet sich auf der beiliegenden CD und ist im Anhang abgedruckt. Für die Entwicklung einer Benutzerverwaltung sind umfangreiche theoretische und praktische Kenntnisse erforderlich, die in dieser kurzen Ausarbeitung nur annährend beschrieben werden können. Die vorliegende rudimentäre Benutzerverwaltung könnte in folgenden Bereichen optimiert werden: - Nur ein Benutzer mit der Admin-Rolle sollte Zugriff auf Auswertung von den Benutzerdaten haben. So ist z. B. die Datei userliste.php jedem Anwender ohne Anmeldung zugänglich. - Durch die Formatierung des Textes mit Hilfe von Cascading Style Sheets (CSS) ergeben sich zahlreiche Möglichkeiten, die Seiten einer Anwendung einheitlich zu gestalten. (vgl. Theis 2011, S. 145–147) - Der Zugriff auf die Datenbank könnte nicht wie im vorliegenden Fall über die mysql- sondern über die mysqli-Schnittstelle erfolgen. "Die mysqli-Schnittstelle ermöglicht eine objektorientierte Programmierung des Datenbankzugriffs auf MySQL und ist damit eine wichtige Hilfe auf dem Weg zu einem übersichtlicheren Code. Ein zweiter Vorteil von mysqli im Vergleich zur älteren mysql-Schnittstelle besteht darin, dass Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Entwicklung einer Benutzerverwaltung, Seite 17 damit sehr effizient SQL-Kommandos mit Parametern ausgeführt werden können [Prepared Statements]." (Kofler und Öggl 2010, S. 417) - "Vertrauen Sie niemanden, insbesondere nicht den Benutzer Ihrer Webanwendung. Benutzer tun immer unerwartete Dinge, entweder mit Absicht oder zufällig, und können daher Fehler oder Sicherheitslücken in Ihrer Site entdecken." (Gutmans et al. 2005, S. 163) In diesem Sinne sollten einige Techniken (Eingabeprüfung, HMAC-Überprüfung, PEAR::Crypt HMAC, Eingabefilter, Mit Passwörtern arbeiten, Fehlerbehandlung) angewandt werden, bevor eine Benutzerverwaltung tatsächlich ins Netz gestellt wird. (analog Gutmans et al. 2005, S. 166– 176) Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Verzeichnisse, Seite 1 5 5.1 Verzeichnisse Literaturverzeichnis Elmasri, Ramez; Navathe, Sham (2009): Grundlagen von Datenbanksystemen. Bachelorausgabe. 3. Aufl. München [u.a.]: Pearson Studium. Gutmans, Andi; Bakken, Stig Saether; Rethans, Derick (2005): PHP 5 aus erster Hand. Das Entwicklerhandbuch für Profis. München ;, Boston [u.a.]: Addison-Wesley. Kline, Kevin E.; Kline, Daniel; Hunt, Brand (2005): SQL in a nutshell. 2. Aufl. Beijing ;, Cambridge ;, Farnham ;, Köln ;, Paris ;, Sebastopol ;, Taipei ;, Tokyo: O'Reilly. Kofler, Michael; Öggl, Bernd (2010): PHP 5.3 & MySQL 5.4. Programmierung, Administration, Praxisprojekte. München, Boston, Mass. [u.a.]: Addison-Wesley. Landau, Pascal: PHP Loginsystem. Online verfügbar unter http://www.mywebsolution.de/workshops/2/show_PHP-Loginsystem.html, zuletzt geprüft am 13.04.2012. Rupp, Susanne (2009): Dreamweaver CS4. Professionelle Webseiten entwickeln ; [DVD, XAMPP, Tools CS4-Testversionen]. München/Germany: Markt + Technik. Theis, Thomas (2011): Einstieg in PHP 5.3 und MySQL 5.5. [für Programmieranfänger geeignet; Einführung in die Webprogrammierung; Grafiken, PDF, Flash-Anwendungen und E-Mail; Objektorientierung verständlich erklärt]. Bonn: Galileo Press. Wilfing, Benjamin; org, benjamin wilfing@selfhtml (2005): PHP: Sessionbasiertes Loginsystem. Benjamin Wilfing, [email protected]. Online verfügbar unter http://aktuell.de.selfhtml.org/artikel/php/loginsystem/, zuletzt aktualisiert am 12.07.2009, zuletzt geprüft am 13.04.2012. 5.2 Bildverzeichnis Abbildung 1: ER-Modell für Benutzerverwaltung .................................................................................. 8 Abbildung 2: Struktur der SQL-Datenbank ............................................................................................ 9 Abbildung 3: Auswahlmöglichkeiten im Adminbereich ........................................................................ 11 Abbildung 4: Adminbereich - Rolle auswählen .................................................................................... 11 Abbildung 5: Darstellung der Benutzer einer bestimmten Rolle .......................................................... 12 Abbildung 6: Anzeige der Benutzer mit jeweiliger Rolle sortiert nach Benutzer.................................. 13 Abbildung 7: Anzeige der Benutzer mit jeweiliger Rolle sortiert nach Rollename ............................... 14 Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de Verzeichnisse, Seite 2 5.3 Anhang 1. Ausdruck SQL-Anweisung für Datenbank 2. CD mit lauffähigem Quellcode Gunther Ehrhardt | Bahnstraße 1 | 97256 Geroldshausen Tel. 09366 980959 | Fax 09366 980960 | E-Mail [email protected] www.buero-update.de