PHP und *SQLPHP: Hypertext Preprocessor (ursprünglich "Personal Home Page Tools") ist eine Skriptsprache mit einer an C bzw. C++ angelehnten Syntax, die hauptsächlich zur Erstellung von dynamischen Webseiten oder Webanwendungen verwendet wird. PHP ist Open-Source-Software. MySQL ist ein Relationales Datenbankverwaltungssystem der schwedischen Firma MySQL AB. MySQL ist als Open-Source-Software für verschiedene Betriebssysteme verfügbar und bildet die Grundlage für dynamische Webauftritte. Alternativ zu MySQL kann auch PostgreSQL als Datenbanksystem verwendet werden. PostgreSQL ist ein freies objektrelationales Datenbanksystem (ORDBMS). Es hat eine Entwicklungsgeschichte die bis in die frühen Achtzigerjahre zurückreicht und wird seit 1997 laufend von einer Open-Source-Community weiterentwickelt. Die Angaben der verwendeten Übungsbeispiele stehen aktualisiert zum Download bereit Arbeitsumgebung und vorgeschlagene ToolsBevor man PHP Dateien auf seinem Rechner testen kann, gilt es einige Programme und Tools zu installieren. Theoretisch ist es nötig, den Webserver Apache, die Skriptsprache PHP und den Datenbankserver MySQL jeweils separat in dieser Reihenfolge zu installieren. Will man jedoch nur einen "kleinen" Testserver für die lokale Websiteentwicklung, so kann man auch XAMPP anstatt der drei installieren. XAMPP stellt die drei Produkte unter Microsoft Windows zur Verfügung und ist für Anfänger leichter zu bedienen. Für produktive Server ist es jedoch weniger zu empfehlen, wobei in diesem Fall ohnehin eine Linux-basierte Installation die bessere Alternative ist ( Da HTML ein Standard des W3C ist, gibt es viele verschiedene Tools, um Webseiten und Bildinhalte zu erstellen und diese anzuzeigen. Aus technischen und menschlichen Gründen sind Open Source Programme für die Verwendung im Unterricht ideal. Da der Kurs leider auf Microsoft Windows (und nicht auf einer von mir bevorzugten Linuxdistribution) basiert schlage ich folgende Tools vor:
Alle Programme stehen für mehrere Betriebssysteme (Windows, Linux,...) zur Verfügung. Um einen reibungslosen Ablauf zu gewährleisten, steht während dem Kurs ein Linuxrechner mit dem Apache Webserver und PHP und MySql Unterstützung zur Verfügung. Weiters ist auf dem Rechner ein FTP und ein SSH Server installiert, um beim Upload der Dateien keine Zeit zu verlieren. Alle Programme stehen für mehrere Betriebssysteme (Windows, Linux,...) zur Verfügung. Um einen reibungslosen Ablauf zu gewährleisten, steht während dem Kurs ein Linuxrechner mit dem Apache Webserver, PHP, MySql und PostgreSQL zur Verfügung. Weiters sind auf dem Rechner ein Samba und ein SSH Server installiert, um beim Upload der Dateien keine Zeit zu verlieren. Nach der Installation aller Programme empfiehlt es sich den Apache Webserver und das als Modul dazuinstallierte PHP zu testen. Dafür legt man eine Datei <?php phpinfo() ?>als Inhalt an und kopiert diese in sein htdocs Verzeichnis. Danach kann man in Mozilla Firefox unter http://localhost/test_installation.php versuchen, die Datei zu anzuzeigen. Wird eine Seite mit Informationen über die PHP Installation angezeigt, so hat die Installation geklappt. Eventuell ist es nötig, die Ports 80 (http), 443 (https) und 3306 (mysql) in der Firewall zu deaktivieren, wenn ein Zugriff von Fremdmaschinen gestattet werden soll.
Grundlegendes PHPDer PHP Code wird in <?php // this is a comment /* this is a long comment that spans over multiple rows */ print "This is PHP Code.<br />"; echo "This is PHP Code as well.<br />"; ?> Im obigen Beispiel sind VariableEine Variable in PHP ist immer (sowohl beim Zuweisen als auch beim Abrufen) durch ein führendes <?php // here we assign a value to a variable $testVar = 6; // and now we retrieve it echo $testVar; ?> Bei der Verwendung von Variablen (sowie allen anderen Namen in PHP) ist besonders auf Groß- und Kleinschreibung zu achten. Will man innerhalb einer Funktion eine ausserhalb definierte Variable verändern, so empfiehlt sich die Verwendung des Schlüsselwortes <?php // change a global variable global $testVar; $testVar = 6; ?> Analog können Variablen als statisch deklariert werden, was bedeutet, dass sie zwar nicht global sind, jedoch am Ende einer Funktion nicht gelöscht werden. Dazu dient das Schlüsselwort <?php // define a static variable static $testVar = 0; // increment the static variable $testVar = $testVar + 1; ?> Dabei ist es bemerkenswert, dass <?php echo htmlentities($_SERVER["PHP_SELF"]); ?> welche es ermöglicht, ein Skript nocheinmal aufzurufen, da
Will man Werte definieren, die sich während des Programablaufes nicht ändern können, so verwendet man Konstanten. Solche Konstanten sind eigentlich keine Variablen, aufgrund gewisser Ähnlichkeiten nehme ich sie aber auch in diesen Abschnitt. Anders als Variablen ist hierbei, dass es sich empfiehlt, lediglich Großschreibung für ihre Namen zu verwenden und dass die Namen nicht mit einem <?php define("NAME", value); echo NAME; // alternative: constant(strConstName); ?> definiert und verwendet werden. Nützliche, bereits in PHP vordefinierte Konstanten sind zum Beispiel __FILE__ // filename incl. path of php script __LINE__ // line number in the current php script Bedingte Ausführung und SchleifenIm folgenden wird nur ganz kurz die Syntax der einzelnen Schleifen dargestellt, auf eine Erklärung wird verzichtet. Falls der Code nicht klar sein sollte, empfehle ich, damit zu experimentieren, da dies die beste Art ist, Programmieren zu lernen. if (expression) { ... } elseif (expression) { ... } else { ... } $myVar = condition & value_if_true : value_if_false; switch ($variable) { case label1: ... [break;] case label2: ... [break;] case label3: ... [break;] default: ... } while (condition) { ... } do { ... } while (condition); for ([initialization]; condition; modification) { ... } Um die Ausführung einer Schleife ganz abzubrechen, verwendet man das DatentypenPHP versucht, so gut es geht, Datentypen automatisch zu konvertieren. Sollte es jedoch einmal nötig sein, einen Datentyp explizit zu konvertieren, so muss man den Datentyp "casten" (die englische Bezeichnung dafür ist "type casting") (int), (integer) (bool), (boolean) (float), (double), (real) (string) (array) (object) FunktionenEine Funktion in PHP wird mit dem Keyword <?php function myFunction([$arg1, $arg2, $arg3="defaultvalue", ...]){ // does stuff [return $stuff;] } // call the function myFunction(); ?> Ein Rückgabewert kann mit var $result = doStuff($myArg); Um ein Argument (einen Parameter) an die Funktion nicht als Wert, sondern als Referenz zu übergeben, muss man ein <?php function myFunction(&$refArg){ // does stuff $refArg = "result"; } ?> Einige wichtige Funktionen
Eine komplette Funktionsreferenz findet sich auf http://www.php.net (die Deutsche Version ist unter http://www.php.net/manual/de/ erreichbar). ArraysIn PHP kann man auf zwei Arten von Arrays zugreifen - jene, die "normal" mit einer Zahl (von 0 beginnend) indiziert werden und jene, bei denen jedem Element ein Schlüssel zugeordnet ist. Letztere sind zum Beispiel praktisch, um Konfigurationsdaten zum speichern. Will man den ersten Typ verwenden, so genügt folgende Syntax <?php $myArray[] = "first value"; $myArray[] = "second value"; ?> Für den zweiten Typ muss man in den eckigen Klammern den Schlüssel (engl. key) angeben. Im Key können auch Leerzeichen und manche Sonderzeichen enthalten sein (von deren Verwendung ich aber abrate). <?php $myArray["key1"] = "first value"; $myArray["key2"] = "second value"; ?> Will man eine Schleife über alle Werte eines Arrays laufen lassen, so hilft das <?php foreach ($myArray as $key => $value) { // do stuff } ?> Eine andere Möglichkeit auf alle Elemente eines Arrays zuzugreifen bieten die Sprachkonstrukte <?php while(list($key,$value) = each($myArray)) { // do stuff } ?> Array Funktionen
Objekte und KlassenObjektorientierte Programmierung ist ein versuch, Programmierung mehr an die Denkweise von "normalen" Menschen anzupassen. Wir denken sehr häufig in angreifbaren Objekten, wodurch es logisch erscheint, auch Programmcode in virtuelle Objekte zu verpacken, die Eigenschaften und Methoden haben. Klassen sind am besten als Objektfabriken vorstellbar. Klassen werden in der Regel in eigenen Dateien angelegt, um sie einfacher wiederverwenden zu können. Eine Klasse sieht grob wie folgt aus (per Konvention schreibt man den ersten Buchstaben des Namens einer Klasse groß) <?php class MyClass { public function __construct([$arg1, ...]) { // PHP 5.0 constructor $this->var1 = 0; } public function doStuff([$arg1, ...]){ // does stuff } private $var1; protected $var2; public $var3; } ?> Die erste Funktion im obigen Beispiel ist ein Konstruktor - sie wird beim Erstellen einer neuen Instanz der Klasse aufgerufen. Eine Konstruktorfunktion hat die Syntax <?php $myObject = new MyClass(); ?> Auf öffentliche ( <?php $myObject->doStuff(); ?> Klassen können auch durch Unterklassen erweitert werden. Dies ist sinnvoll, wenn verschiedene Klassen viele gemeinsame Eigenschaften und Funktionen haben - zum Beispiel könnte man eine Klasse <?php class Car { public function __construct(){ // do stuff } public static myVar = 0; } class Renault extends Car { public function __construct(){ parent::__construct(); // do more stuff } } ?> Bereits vorhandene Methoden können einfach überschrieben (overridden) werden. Will man dabei die Funktionalität der Funktion der Elternklasse (auch Superklasse genannt) nicht verlieren, so hilft das Car::myVar = 3; Kommunikation mit MySQLPHP hat einige integrierte Funktionen zur Kommunikation mit MySQL. Ihre Benutzung ist relativ einfach und sei im Folgenden durch ein Beispiel mit Kommentaren beschrieben (das Beispiel verwendet die ebenso zum Download angebotene, sehr simple Datenbank Nach dem Hinunterladen erstellen wir eine leere Datenbank shell> mysql -u root -p mysql> CREATE DATABASE store; mysql> GRANT ALL ON store.* TO 'test'@'localhost' IDENTIFIED BY '12345'; mysql> exit; shell> mysql -u root -p -D store < store.sql Dieser Weg ist zwar recht "schön und einfach", jedoch kann er für große Anwendungen sehr problematisch sein, da der erstellte PHP Code nur mit MySQL funktioniert. Will man sich die Option offenhalten, andere Datenbanken mit dem gleichen Code anzusteuern und dadurch unabhänigeren (imho besseren) Code zu schreiben, sollte man das Datenbankmodul von PEAR (PHP Extension and Application Repository) verwenden. Die unterstützten Datenbankverwaltungssysteme sind fbsql, ibase, informix, msql, mssql, mysql, mysqli, oci8, odbc, pgsql, sqlite und sybase. Die Installation des Datenbankteils von PEAR unter Linux geht wie gewohnt sehr einfach sudo apt-get install php-db Da dies aber nur ein Einführungskurs ist, bleibt das "Entdecken" von PEAR jedem selbst überlassen, jedoch gibt mysql_connect_pear.php.gz eine zu dem obigen Beispiel korrespondierende, erste Orientierung. Viel Spass & "Happy Hacking"! Generieren eindeutiger IDsManchmal ist es nötig, beim Einfügen von $last_id = mysql_insert_id(); Diese Funktion gibt jene ID zurück, die beim letzten Aufruf von FormulareUm auf ein Fomularfeld zugreifen zu können stellt PHP die Variablen <?php $strValue = $_GET["fieldName"]; ... <input type="text" name="fieldName" /> ?> Ein recht wichtiger Tip ist, Feldern, die mehrere Werte zurück geben, ein Array als Namen zuzuweisen, da sonst nur der zuletzt ausgewählte Wert gespeichert werden würde <?php ... <input type="checkbox" name="arrayName[]" value="val1" /> ... <input type="checkbox" name="arrayName[]" value="val2" /> ... $values = $_GET["arrayName"]; ?> wobei beim Abrufen mit <form action="<?php echo(htmlentities($_SERVER['PHP_SELF'])); ?>" method="GET"> SessionsDamit sich ein authentifizierter Benutzer nicht auf jeder Seite, die er ansieht, neu anmelden muss, verwendet man Sessions. Alternativ könnte man auch normale Cookies und URL passing verwenden, wobei Sessions mit den zugehörigen Session Cookies zu bevorzugen sind. Gründe dafür sind, dass sie unter Verwendung einer verschlüsselten Verbindung relativ sicher sind, die meisten Browser Session Cookies akzeptieren und dass Sessions recht einfach zu verwalten sind. Nachdem man einen Benutzer authentifiziert hat, kann man eine Session mit <?php session_start(); ?> beginnen. Im Array <?php session_start(); if (!isset($_SESSION['user_id'])){ header("location:session3_form.php"); } ?> Der obige PHP Code muss ganz am Anfang jeder Seite stehen, für die eine Anmeldung nötig ist - noch bevor man irgendeinen Output (zum Beispiel mit <?php session_start(); session_destroy(); ?> TemplatesNur als kleiner Ausblick seien Templates bzw. Template Engines erwähnt. Sie dienen dazu, den PHP Programmcode vom Layout (XHTML und CSS) zu trennen. Eine der bekannteren Templateengines ist Smarty. Eine Installation unter Debian GNU/Linux erfolgt durch sudo apt-get install smarty Benutzer anderer Betriebssysteme können Smarty über die Projekthomepage, http://www.smarty.net/ beziehen, auf der sich auch gute Dokumentation befindet. Einführung in MySQLEinige Hinweise zur Installation von MySQL sowie von phpmyadmin unter Linux finden sich unter linux_administration.php#mysql. Auf dieser Seite wird auch das Erstellen von Backups besprochen. Nachdem man sich mit shell> mysql [-h localhost] -u root in den MySQL Server eingeloggt hat, stehen einige Befehle zur Verfügung
Die folgenden Statements setzen das Administrationspasswort ( mysql> SET PASSWORD = PASSWORD('your_password'); mysql> CREATE DATABASE your_database; mysql> GRANT ALL ON your_database.* TO 'new_user'@'localhost' -> IDENTIFIED BY 'new_user_password'; In der Folge kann man sich nur mehr mit dem richtigen Passwort anmelden und der Aufruf von MySQL ändert sich zu shell> mysql [-h localhost] -u username -p Nach dem Verbinden können wir die Datenbank auswählen, mit der wir arbeiten wollen mysql> USE your_database; Nach der Auswahl der Datenbank erstellen wir eine Tabelle mit der Syntax mysql> CREATE TABLE tblName ( -> column1Name DATATYPE (SIZE) OPTIONS, -> column2Name DATATYPE (SIZE) OPTIONS, -> ..., -> PRIMARY KEY (columnXName)); In der obigen Syntax können die mysql> CREATE TABLE users ( -> user_id INT NOT NULL AUTO_INCREMENT, -> username VARCHAR (35), -> PRIMARY KEY (user_id)); In der folgenden Tabelle sind einige relevante Datentypen aufgelistet (eine vollstaendige Liste mit Erklärungen findet sich auf http://dev.mysql.com/doc/refman/5.0/en/data-types.html)
Das Eingeben von Daten mit dem MySQL Client folgt der Syntax mysql> INSERT INTO tblName [COLUMNS (col1, col2, ...)] VALUES (val1, val2, ...); Wird dabei der mysql> INSERT INTO USERS VALUES (NULL,"gerald"); Verändern vorhandener TabellenAuch nachdem eine Tabelle bereits Daten enthält kann man sie und ihre Spalten bis zu einem gewissen Grad verändern (ich empfehle jedoch, schon vor Eingabe der Tabellen gründlich zu überlegen, um nachträgliche Änderungen so gut es geht zu vermeiden) mysql> ALTER TABLE tblName RENAME tblNewName; mysql> ALTER TABLE tblName MODIFY colName DATATYPE (SIZE) [FIRST|AFTER otherColName]; mysql> ALTER TABLE tblName ADD colName DATATYPE (SIZE) [FIRST|AFTER otherColName]; mysql> ALTER TABLE tblName CHANGE colName colNewName DATATYPE (SIZE) [FIRST|AFTER otherColName]; mysql> ALTER TABLE tblName DROP colName; mysql> DROP TABLE tblName; Die wohl beste Referenz über die verschiedenen AbfragenDer Sinn von Datenbanken liegt darin, die Daten abrufen zu können - und zwar in genau der Form, die man benötigt. Die dafür verwendeten Abfragen haben die Grundform mysql> SELECT col1[, col2,...] FROM tblName[,tbl2,...] [WHERE CLAUSE] [ORDER BY CLAUSE]; Um alle Spalten einer Tabelle anzuzeigen (also einfach die ganze Tabelle anzuzeigen) verwendet man mysql> SELECT * FROM tblName; Um mit dem Schlüsselwort mysql> SELECT * FROM users WHERE username = "gerald"; Die mit Will man die Daten beispielsweise aufsteigend nach der Spalte username sortieren, so verwendet man mysql> SELECT * FROM users ORDER BY username; Will man sinnvoll Daten von mehreren Tabellen abfragen, so verwendet man mysql> SELECT tbl1.*, tbl2.colName FROM tbl1, tbl2 WHERE tbl1.id=tbl2.id; Im obigen Beispiel werden die Tabellen mit der in beiden vorkommenden Spalte mysql> SELECT * FROM tbl1 NATURAL JOIN tbl2; Das gleiche geht mittels mysql> SELECT * FROM tbl1 JOIN tbl2 ON tbl1.id=tbl2.id; Will man sich einiges an Tipparbeit ersparen, so kann man Aliases für Tabellennamen mit dem Schlüsselwort mysql> SELECT * FROM tbl1 AS t1 JOIN tbl2 AS t2 ON t1.id=t2.id; wobei nach der Definition des Alias nur mehr dieser verwendet werden darf. Will man zwei Tabellen so verknüpfen, dass von der ersten (linken) alle Werte angezeigt werden und von der zweiten nur die Werte, die in der verknüpften Spalte der ersten Tabelle auch existieren, dann verwendet man ein SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.colName = tbl2.colName; WildcardsUm bei einer Abfrage Wildcards verwenden zu können gibt es das mysql> SELECT * FROM tblName WHERE colName LIKE expression; Um mit dem obigen Beispiel alle Benutzer zu finden, deren Benutzername mit einem "g" beginnt schreibt man mysql> SELECT * FROM users WHERE username LIKE "g%"; Löschen und Verändern von DatenUm Daten aus der Datenbank zu löschen, verwendent man das mysql> DELETE FROM tblName [WHERE CLAUSE]; Ein schnelles Löschen von allen Daten in einer Tabelle ist mit mysql> TRUNCATE TABLE tblName; möglich. Zum Verändern der Daten verwendet man das mysql> UPDATE tblName SET colName=value [WHERE CLAUSE]; Gruppieren von InformationenWie in allen mir bekannten SQL basierten Datenbanken ist es natürlich auch möglich, Daten zu Gruppieren und Funktionen über die gruppierten Daten zu verwenden. Die allgemeine Syntax dafür ist mysql> SELECT col1, FUNCTION(col2) FROM tblName GROUP BY col1; Will man zum Beispiel in einer Tabelle mit Rechnungen von Kunden nach den Kundennamen gruppieren und ihre Einkaufssummen (Spalte "value") ausrechnen, so verwendet man mysql> SELECT name, SUM(value) FROM invoices GROUP BY name; Häufige Funktionen
IndexWenn man besonders oft nach Werten in einer Spalte sucht oder die Tabelle nach einer Spalte sortiert, ist es sinnvoll, die Spalte mit einem Index zu versehen mysql> CREATE [UNIQUE] INDEX indName ON tblName (colName); Weiss man schon beim erstellen einer Tabelle, dass man einen Index auf eine Spalte anwenden will, so kann man gegen Ende der Tabellendefinition ein -> ... -> INDEX|UNIQUE indName (colName));schreiben. DatenbankfunktionenAufgrund der grossen Anzahl und Komplexität dieser Funktionen sind hier nur einige beispielshaft aufgelistet
Hier noch ein Beispiel der Verwendung einer solchen Funktion ("price" und "name" sind Spaltennamen) mysql> SELECT CONCAT('The price of ',name,' is ', price) FROM products; Das Ganze geht auch ohne eine Tabelle zu referenzieren mysql> SELECT NOW(); Für eine komplette Liste mit detaillierten Informationen bietet der MySQL Client wie oben erwähnt eine eigene Hilfefunktion mysql> HELP functions; Einführung in PostgreSQLEinige Hinweise zur Installation und Einrichtung von PostgreSQL unter Linux sowie zum Erstellen von Datenbankbackups finden sich unter linux_administration.php#postgres. LinksHier folgt eine (unsortierte) Aufstellung einiger der im Kurs gezeigten Webseiten.
Copyright © 2009-2023 Gerald Senarclens de Grancy Haftungsausschluss: Da ich keinerlei Einfluss auf den Inhalt der Seiten, zu denen ich von meiner Homepage linke, habe, übernehme ich auch keinerlei Haftung für diese Seiten. |