An der VHS Braunschweig findet ein Seminar zum Thema "Dynamische Webseiten mit PHP & MySQL" statt. Der 5-tägige Bildungsurlaub soll eine praxisorientierte Einarbeitung in die Techniken der serverseitigen Skripte mit PHP und einer Datenbankanbindung am Beispiel der DB MySQL. Hier die Rahmendaten unseres Seminars:
Ort: VHS Braunschweig, Heydenstraße, Raum 2.01 (! - Raumwechsel)
Zeiten: Mo, 14.06. - Fr, 18.06.2010; von 08.30 - 16.00 Uhr
Wir wünschen - wie immer - viel Spaß und Erfolg bei unseren Seminaren. Die Inhalte des Seminars werden wir an dieser Stelle mit einem "Roten Faden" begleiten ...
Ihr Trainer Joe Brandes, Braunschweig, 2010-06-13
Montag, 14.06.2010, 08.30 - 16.00 Uhr
- Orientierungsphase - Themen der TN mit "Rotem Faden" abgleichen
TN-Thema: Web-Hosting erläutern (Techniken, Preise, Verwaltung) - Hinweis auf Cobra Shop - verbilligte Schüler-Studenten-Lehrer-Lizenzen
von diversen SW-Herstellern - Diashow LAMP (Link pcsystembetreuer.de)
L: Linux (Alternativ W: Windows) - Betriebssystem
A: Apache - Webserver - www.apache.org
M: MySQL - Datenbankserver - www.mysql.com
P: PHP - serverseitige Skriptsprache - www.php.net - Serverseitige Skriptsprache für unser Seminar: PHP
rekursives Akronym: PHP Hypertext Preprocessor (PHP Hypertext "Vorbearbeiter")
PHP bei Wikipedia (gute Darstellung Client-/Server Prinzip Dienst WWW)
Hilfedatei (CHM - Compressed Help Manual) über www.php.net - documentation - documentation download - hier verschiedene Formate immer aktualisiert für die jeweils aktuelle PHP Version - Entwicklungsumgebung für serverseitige Skripts:
Apachefriends: alle Serverdienste und Zusatzfunktionen fix und fertig!
Warnung: diese Umgebung nur für Testserver und Entwicklung nutzen,
niemals als echten Server (Produktionsserver) - Apachefriends Xampp - X für L(inux), W(indows), M(acOS X), S(olaris)
Standard-"Installation": einfach auf C:\ entpacken und automatisch durchlaufen lassen
Steuerung über Xampp Control Center (siehe Hauptverzeichnis c:\xampp) - Test der Apachefriends Serverinstallation nach Starts von Apache und Co
Adresse des Servers im Browser aufrufen:
http://localhost (oder alternativ http://127.0.0.1) - Resourcen local und remote
local: c:\xampp\htdocs\uebungen\info.php
remote: http://localhost/uebungen/info.php - Beachten: Windows Explorer (Win-Taste + E) - Extras - Ordneroptionen - Ansicht
Erweiterungen (Dateiendungen) müssen eingeblendet sein! - Datei- und Ordnerbezeichnungen: (WICHTIG)
Groß- und Kleinschreibung - Empfehlung: alles klein
keine Leerzeichen - Verbindungen mittels ..._... (Tiefer Strich, Unterstrich)
keine Umlaute/ Sonderzeichen - also kein ä, ü , ö oder ß - Erster Editor der Woche: PSPad (Website: www.pspad.com/de)
Alternativen: Installer für Windows oder CAB-Datei für USB-Stick und Co
Syntax-Highlighting - siehe Symbol in Standard-Symbolleisten
Code-Completion / Code-Komplettierung - Tastenkombi STRG + Leertaste
Hilfe-Integration - über Einstellungen - Highlighter einstellen ... - PHP - (rechte Seite) Register Spezifikation - Sprachspezifische Hilfedatei (ALT + F1) - Erste Codes selbst getippt und der PHP-Hilfe entnommen
insbesondere: Einsatz der Funktion phpinfo() um sich alle PHP/Apache-Konfigurationen auflisten zu lassen! - Ausgaben kontrolliert im Browser UND in Quellcodeansicht!
Steuerung von Zeilenumbrüchen im Quellcode mittels \n
Zeilenbrüche im Browser-Body: html-Tag <br /> (Empfehlung xhtml-Codierung) - Textübergaben PHP an Browser mittels echo
Unterschiede bei einfachen und doppelten Anführungszeichen
Ausgabe von Variableninhalten ($foo) bei doppelten Anführungszeichen, hier schaut PHP so zu sagen rein in die Strings - Arrays (Übung 007_)
tbc Di...
Hier ein paar Code-Beispiele, wie sie in der PHP-Hilfe zum Thema echo zu finden sind:
<?php echo '<p>Hallo Welt</p>'; echo "Diese Ausgabe geht über\nmehrere Zeilen. Die Zeilenumbrüche werden\nebenfalls ausgegeben."; // Sie können Variablen innerhalb eines echo-Statements verwenden $foo = "foobar"; $bar = "barbaz"; echo "foo ist $foo"; // foo ist foobar // Sie können auch Arrays nutzen $bar = array("wert" => "foo"); echo "Das ist {$bar['wert']} !"; // Das ist foo ! // Wenn Sie einfache Anführungszeichen verwenden, wird der Name der Variable // anstelle ihres Inhalts ausgegeben echo 'foo ist $foo'; // foo ist $foo // Sie können auch ausschließlich Variablen ausgeben, // sofern Sie keine weiteren Zeichen ausgeben wollen echo $foo; // foobar echo $foo,$bar; // foobarbarbaz // Einige Programmierer bevorzugen es, mehrere Parameter // mithilfe von Stringverkettung auszugeben echo 'Dieser ', 'String ', 'besteht ', 'aus ', 'mehreren Parametern.', chr(10); echo 'Dieser ' . 'String ' . 'wurde ' . 'mit ' . 'Stringverkettung erzeugt.' . "\n"; ?>
Dienstag, 15.06.2010, 08.30 - 16.00 Uhr
- Rekapitulationen und Rückfragen TN - Fortsetzung/ Einführung Arrays
- Arrays sind 2-spaltige Tabellen mit Index => Werte
Indizes mit Zahlen 0, 1, ... sind nummerische Arrays
Indizes mit beliebigen Datentype sind assoziative Arrays (Hash-Tabellen)
wichtigste Array-Funktion: foreach ( $kontakt as $key => $elem) { ... } - Stichworte: vordefinierte Variablen, register_globals, Superglobale Arrays
Übungen 001 bis 007 komplettiert
insbesondere 005_konstanten_variablen.php: siehe $SERVER_NAME
muss heute heißen: $_SERVER['SERVER_NAME'] - Online-Quellen (Zeitschriften und Bücher) zum Selbststudium
Stefan Münz, "Webseiten professionell erstellen" - Link - Ältere Auflage als PDF!
Mark Lubkowitz, "Webseiten programmieren und gestalten" - Link Galileo Verlag
Internet Magazin, Weka-Verlag / Magnus.de, monatliches Fachjournal - Link
PHP Journal, 2-monatiges Fachjournal - Link
Selfphp Projekt (Damir Enseleit, Matthias Kannengiesser) - Link - kompletter DL verfügbar! - Formulare: html-Tag <form> sorgt für komplette Zuweisung von Variablennamen
Zuweisung des Skripts zum Auswerten über action="machmal.php"
und Festlegung der Übertragungsmethodik mittels method="post" oder "get"
Sauberes Verarbeiten mit den Arrays $_POST['name'] oder $_GET['name']
Alte Notlösungen mit $name oder $HTTP_POST_VARS[] funktionieren mit
register_globals=off (siehe phpinfo) und spätestens ab PHP Version 5.3.x nicht mehr! - wichtige String-Funktionen:
print, printf, htmlspecialchars, rawurlencode, nl2br, get_meta_tags,
addslashes, stripslashes, implode, explode, substr und str_replace - es wächst zusammen, was zusammen gehört: PHPDIA
eine dynamische Website, die eine Bildergalerie aus einer CSV-Datei "liest" und dann basierend auf einem html-Template dynamisch die jeweilige Bildpräsentation generiert
Copyright: Internet Professionell, Ausgabe 08/2003, Mark Lubkowitz
Hier mal der Code der Diashow für die Analyse - hervorgehobene Zeilen werden unten erklärt:
<?php if($_GET['fn'] && file_exists($_GET['fn'])) { // Template laden $output_html = implode('',file('template.htm')); // CSV-Datei einlesen $pics = file($_GET['fn']); // Nummer des anzuzeigenden Bildes festlegen $pic_nr = $_GET['nr'] ? $_GET['nr'] : 1; // Bilddatensatz laden list($filename,$description) = explode(';',$pics[$pic_nr-1]); // Vorwärts - Rückwärts $pprev = ($pic_nr <= 1) ? 1 : ($pic_nr - 1); $pnext = ($pic_nr >= count($pics)) ? count($pics) : ($pic_nr + 1); // Picturelist $piclist = ''; for($i=0; $i<count($pics); $i++) { $piclist .= '<a href="'.$PHP_SELF.'?fn='.$_GET['fn'].'&nr='.($i+1).'">Bild '.($i+1).'</a>'; if(($i+1) <> count($pics)) { $piclist .= ' · '; } } // Ausgabe $output_html = str_replace('<@prevlink@>',$PHP_SELF.'?fn='.$_GET['fn'].'&nr='.$pprev,$output_html); $output_html = str_replace('<@nextlink@>',$PHP_SELF.'?fn='.$_GET['fn'].'&nr='.$pnext,$output_html); $output_html = str_replace('<@picture@>',$filename,$output_html); $output_html = str_replace('<@number@>',$pic_nr,$output_html); $output_html = str_replace('<@piccount@>',count($pics),$output_html); $output_html = str_replace('<@description@>',$description,$output_html); $output_html = str_replace('<@piclist@>',$piclist,$output_html); echo $output_html; } else { die('Ungültige Diashow!'); } ?>
Mittwoch, 16.06.2010, 08.30 - 16.00 Uhr
- Rekapitulation und TN-Fragen
- Ausführliche Analyse von PHPDIA in der CSV-Variante
der Reihe nach (s.o.)
line 03: Skript abarbeiten wenn sowohl per GET die Variable fn übergeben wird
und gleichzeitig der übergebene Filename als Datei im gleichen Verzeichnis existiert
line 06: Variable $output_html wird über die Kombination von Dateioperation file und dann ein implode erzeugt - bewirkt das Laden der Template-HTML-Datei template.htm in die String-Variable $output_html
line 09: hier file alleine - file erzeugt ein numerisches Array namens $pics
line 12: Festlegen der Bildnummer ($pic_nr) über eine einfache if-Verzweigung in Kurzschreibweise
line 15: explode zerlegt für Bildnummer-Array-Eintrag beim ; (siehe CSV-Datei) den String und das linke implode weist dann beiden Teilen der Reihe nach die Variablen $filename und $description zu
usw. .... - besondere Anmerkung: Skript funktioniert, obwohl die genutzte vordefinierte Variable $PHP_SELF hier nicht PHP 5.3 konform eingesetzt wird! Richtig ist: $_SERVER['PHP_SELF']
- php-String-Funktion str_replace()
ersetzt ab line 33 in der Variable $output_html alle Platzhalter (<@...@>) und sonstige Inhalte oder Linkbezeichungen und Anker bzw. Hypertextreferenzen
in line 40: hier wird die "gesamte" Website an den Browser ausgegeben! - Einführung in MySQL / Datenbanksystem in Client-/Server-Technik
MySQL-Server (mysqld - mysql daemon - Dienst/Service)
MySQL-Client (mysql - in cmd gezeigt - Connection (Verbindung) zu einer Datenbank mittels Angabe von (hier XAMPP)
host: localhost
username: root
passwort: NULL
danach Auswahl einer Datenbank und Arbeit mit den Tabellen - DB-Theorie: Entwurf der ersten 3 Normalformen (nach Beispiel M. Kofler)
für eine kleine Buch-Datenbank (4 Bücher, 3 Verlage, 7 Autoren) verlangt (!) 4 in Beziehung bestehende Tabellen - phpmyadmin (PHP-Skriptsammlung für MySQL Administration)
Standard-URL auf Servern: http://localhost/phpmyadmin
Oberfläche der Verwaltungsplattform erkundet - phpmyadmin-Praxis: das Beispiel PHPDIA (nach Lubkowitz) um die Diashow in MySQL-Technik erweitert
insbesondere: Analyse der php-Codes in diashow.php (siehe include von config.inc.php)
Wichtig: die Konfigurations-Include-Dateien müssen immer PHP-Dateien (Endungen) sein!
Anlegen der Datenbank mark und der beiden Tabellen ds_categories und ds_pictures (ds_ ist ein Prefix/ Präfix)
Navigation am oberen Rand von phymyadmin über Breadcrumb-Leiste ("Brotkrumen") - Erste Analyse des SQL-Kommando-Strings select ... in diashow.php der MySQL-Lösung
Donnerstag, 17.06.2010, 08.30 - 16.00 Uhr
- Rekapitulation und TN-Fragen
- SQL-Kommando-String in der diashow.php analysiert
SELECT p.title, p.comment, c.name
(wähle die Felder ds_pictures.title, ds_pictures.comment, ds_categories.name)
FROM ds_pictures p, ds_categories c
(aus den Tabellen ds_pictures mit Abkürzung p und ds_categories mit Abk. c)
WHERE (p.category = $show_nr) and (p.category = c.id)
(wo die p.category gleich $show_nr und auch p.category gleich c.id sind)
SORT by p.id asc limit ($pic_nr - 1) , 1
(sortiert nach p.id aufsteigend) - Praxis mit SQL in phpmyadmin: in SQL-Konsole von phpmyadmin lassen sich alle Aufrufe durchtesten!
- Gegenüberstellung: prozedurale vs OOP Aufrufe
z.B.: mysql_select vs. $db->select ; nach einem $db = new mysqli ()
Ausführliche Erläuterung s.a. phpself-Kochbuch und PHP-Hilfe
Beispieldateien: Grafiken mit php-GD-Bibliotheken ("Bälle durch Pfosten auf Wiese") - Grundbegriffe der OOP-Techniken
Vererbung, Konstruktor (__construct), Dekonstruktor - Kontakte-Datenbank mit den Grundfunktionen
INSERT, SELECT, UPDATE, DELETE
moderne Vorgehensweise mit prepare und try/catch
Bereitstellung der Tabelle kontakt über kontakt.sql - Import mit phpmyadmin - Backup-Techniken für PHP / MySQL Projekte
Empfehlung: Testserver und Produktionsserver (ggf. noch Backupserver)
1) Webserver-Verzeichnis per FTP (besser SFTP) übertragen und bedenken ggf. die config.inc.php und .htaccess anzupassen
2) Datenbanktabellen (als DUMP) über Exportieren mit phpmyadmin speichern - Problem bei großen Datenbanken: Laufzeit von PHP-Skripten auf Servern beschränkt (siehe php.ini)
Lösung: www.mysqldumper.de - Skriptsammlung für Sicherungen von größeren Projekten und Unterstützung von automatischen Sicherungen von Datenbanken - Konfigurationsdateien für die XAMPP-Umgebung:
Apache: httpd.conf
PHP: php.ini
MySQL: my.cnf (oder auch my.ini)
Freitag, 18.06.2010, 08.30 - 16.00 Uhr
- Rekapitulation und TN-Fragen
- Analyse der Grundskripte zur Kontakteverwaltung (Jahrgang 2006)
insbesondere die grafische Darstellung (Nassi-Shneiderman Diagramm - Wikipedia) für loeschen.php
Trick hier: im <form> für den Löschen-Button verbirgt sich eine verborgenes <input name="ok"> und die Methode POST, dadurch kann das Skript erst einmal die Daten darstellen und nachfragen - und in einem rechten Abarbeitungsweg mit demselben Skript dann das tatsächliche Löschen durchführen!
- Ausführliche Analyse der überarbeiteten Kontakteverwaltung (Jahrgang 2008)
besondere db.inc.php per require integriert (class Singleton)
Aufruf in index.php: Singleton::holeVerbindung()
Fehleranalyse für den aktuellen Xampp (mit PHP 5.3.1): siehe PHP-chm-Handbuch - Sprachreferenz - Klassen und Objekte (PHP 5) - Static Schlüsselwort - require() vs. include()
bei Nutzung von require muss die Einbindung des Codes funktionieren, sonst ist das Skript zu Ende, bei include würde es weitergehen (engl. required - wird benötigt)
bei der Verwendung in Schleifen sollte include genutzt werden - Ein neuer "Server": ein Ubuntu 10.04 Desktop LTS (Long Term Support)
als Virtuelle Maschine mit der Software VirtualBox
(Anm.: früher Innotek - dann SUN - heute ORACLE !)
Empfehlung für professionelle Testumgebung: Debian Server (ohne grafischen Desktop!) und eine passende PHP-Version passend zu Ihrem Produktionsserver - Tools für Server-Fernwartung und Datei-Operationen:
FTP-Programm: Filezilla, WinSCP
SSH-Client: PuTTY (bitte unbedingt SSH im Webhosting-Paket haben!)
Editoren/IDE (Entwicklungsumgebungen): Netbeans (auch dt., viele Programmiersprachen, Community mit Beispielen, Videos, Debugging mit XDebug siehe Kopien), Ecplipse PDT (nur engl., ohne Installation lauffähig) - Cookies
Client-seitige Text-Info-Dateien von Servern dort hinterlegt
Windows XP - IE Browser: z.B. C:\Dokumente und Einstellungen\benutzername\cookies
Windows XP - Moz FF: in der FF-Profilverwaltung des Users (siehe Extras - Einstellungen - Datenschutz - ...)
nicht in Notepad (Editor) von Windows öffnen, da Umbrüche "fehlen"
Befehl: set_cookie(), Array $_COOKIE[] - Sessions
Server-seitige Speicherungen von Infos eines Besuchers
session.save_path Variable bitte mit phpinfo() checken (Xampp: c:\xampp\tmp)
Befehle: session_start(), session_destroy(), Array $_SESSION[] - Übungsempfehlung zur Wiederholung und Fortsetzung der gelernten Techniken:
mit Netbeans ein neues PHP-Beispiel-Projekt "Air Alliance" umsetzen, besonders gut hier, dass das Projekt Hilfe-html-Seiten mitbringt, um das Projekt zu implementieren - Feedback und letzte Fragen und Anmerkungen
Vielen Dank für Ihr positives Feedback und Ihre Anregungen - insbesondere für Ihr gezeigtes Interesse an den weiteren Seminaren unserer Online Design Seminarreihe.
Ihr Trainer Joe Brandes, Braunschweig, 2010-06-18