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 .= '&nbsp;&middot;&nbsp;';
}
}

// 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!

loeschen-ns-diagramm

  • 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