PHP-Grundlagen

Nachdem wir auf der Startseite PHP gesehen haben was PHP ist und wie es konfiguriert wird, schauen wir uns als Erstes mal den HTML-Quellcode an.

HTML-Quellcode

Den Quelltext erreicht Ihr über Rechtsklick->Quelltext anzeigen. Der Rest ist schnell erklärt:Die Seite ist unterteilt in Header (<header id="head" role="banner">)und einen Layer (<div id="main">).Dieser fungiert als Rahmen und kapselt zwei Navigationen (<nav id="menu" role="navigation"> und (<nav id="navigation" role="navigation">), den eigentlichen Inhalt (<section id="content">), die für die Darstellung der entspechenden Inhalte verwendet werden und einen Footer (<footer id="south">).Details zur Erklärung findet Ihr im HTML-Tutorial.

Einsatz von PHP

Und hier entsteht das Problem, bei dem PHP mit seiner Dynamik helfen soll.Will man auf diese Weise mehrere Seiten bereitstellen (also z. B. Home, Galerie, Statistiken, Datenschutz, Impressum, Kontakt usw.), schreibt man für jede Unterseite eine neue HTML-Datei (home.html, galerie.html, statistik.html, datenschutz.html, impressum.html, kontakt.html usw.) mit gleichem Code für Header und Navigation und hat damit sehr viel Arbeit. Will man dann auch noch etwas ändern, muss man das in allen HTML-Dateien. Um diese aufwendige und fehleranfällige Arbeit zu umgehen, kann man PHP nutzen, in dem man abhängig von der Client-Anfrage über PHP immer einen anderen Content (Inhalt) lädt:

Client-Requests

Es gibt eine Menge an verschiedenen Anfragetypen die ein Browser versenden kann. Eine kleine Erläuterung dazu findet Ihr unter: HTTP bzw. HTTP-Request-Methoden im Blog.
Der Request, der uns interessiert, heißt GET-Request und die Daten für diese Anfrage werden als sogenannter Query-String (eingeleitet mit einem Fragezeichen) an die Webadresse angehängt, wobei immer Schlüssel-Werte-Paare (mit einem Gleichheitszeichen verknüpft) verwendet werden, also z. B.:

http://tutorial.nobs-nobody.de/?directory=php&page=basics

Wie Ihr seht können auch mehrere Schlüssel-Werte-Paare mit dem &-Zeichen verknüpft - siehe HTTP im Blog.
Man könnte sagen, der Browser stellt dem Webserver eine Frage: "Hast du eine Webseite, bei der der Wert von 'page' 'home' ist?"
Und genau das wollen wir uns zu Nutze machen, weil wir all unsere Links so aufbauen und im PHP auf Serverseite dann darauf reagieren, welche Frage uns die Browser stellen.

PHP-Dateien

Wir erstellen uns mit einem einfachen Text-Editor (z. B. Notepad++) eine Datei 'index.php' und legen sie in das Verzeichnis unsere Webseite. Der Code der Datei umfasst dabei lediglich drei effektive Zeilen:
<?php
// client request klonen
$request = $_REQUEST;
// standard wert für page setzen, wenn im client request keiner gesetzt ist
if (empty($request["page"])) {
    $request["page"] = "home";
}
// html code einbinden
require("tpl/index.tpl.php");
?>
Wir erkennen gleich mehrere Dinge an diesen einfachen Code-Zeilen:
  • PHP-Anweisungen stehen grundsätzlich immer innerhalb des Tags <?php ... ?> und werden mit einem Semikolon abgeschlossen
  • Anweisungsblöcke - wie der nach der IF-Bedingung - werden in geschweiften Klammern zusammengefasst - siehe Kontrollstrukturen
  • Kommentare - alles hinter // oder zwischen /* ... */ - werden vom PHP-Interpreter ignoriert
  • Variablen werden durch das $-Zeichen kenntlich gemacht - die Variable der ersten Zeile heiß 'request' (nicht Dollar-Request, das Dollar-Zeichen existiert nur für die Anzeige, das dies eine Variable ist) - siehe Variablen und Konstanten
  • man kann Variablen mit dem Operator ' = ' jeden Wert zuweisen bzw. darin speichern - siehe Operatoren
  • um zu überprüfen, ob eine Variable nicht existiert, leer ist oder Werte wie 'null', '0' oder eine leere Zeichenkette gespeichert hat, verwendet man Funktionen wie isset() (existiert nicht) oder empty() (sie ist leer oder hat etwas leeres gespeichert) - siehe Variablenfunktionen
  • Prozeduren (PHP ist eine prozedurale Sprache) - oder auch Methoden oder Funktionen - werden immer mit Klammern aufgerufen, das was in den Klammern steht nennt man Parameter oder auch Signatur der Methode oder Funktion - siehe Funktionen
  • mit Funktionen wie require() (oder auch require_once(), include() oder include_once()) kann man zusätzliche Dateien einbinden, und sie werden so eingebunden, als hätte man den in ihnen enthaltenen Code hier geschrieben - siehe Einbindung externer Skripts
  • dadurch können Variablen in den eingebundenen Dateien weiter verwendet werden (z. B. $request in der Datei 'tpl/index,tpl.php'), als wären sie dort erstellt worden
Warum nun aber diese drei Anweisungen?

Der Client-Request - siehe HTTP (in der vom Webserver bereit gestellten, geschützten PHP-Variable $_REQUEST gespeichert) ist nur lesbar - siehe Servervariablen.
Gibt der Benutzer die Adresse 'http://php.nobs-nobody.de/simple/' in die Adressleiste seines Browsers ein, soll die Startseite (home) angezeigt werden, das heißt aber, wir müssen einen Standardwert für page setzen, wenn der Client keinen Wert dafür angegeben hat, sonst meldet der Webserver '404 - Not found', weil er nicht weiß, welche Datei er als Antwort senden soll.Dazu brauchen wir aber eine schreibbare Kopie des Client-Requests, die uns durch die erste Zeile in der Variable $request erstellt wird.
Die zweite Zeile setzt den Standardwert für 'page' auf 'home', aber nur dann, wenn nicht bereits ein Wert für page existiert.
Und in der dritten Zeile wird eine PHP-Datei (ein so genqanntes Template - hier das Haupt- oder Main-Template für den immer gleichen HTML-Code) eingebunden.
Das Main-Template spielt dabei eine wichtige Rolle, wie wir weiter unten sehen werden.

Wir erstellen uns erst einmal einen Ordner 'tpl' im Verzweichnis unserer Webseite und legen eine Datei 'index.tpl.php' - oder welchen Namen Ihr auch immer vorzieht, wichtig ist nur die Endung '.php' - an.
Dort hinein legen wir den gesamten HTML-Code mit Ausnahme des eigentlichen Inhalts. Dieser wird in die Dateien home.html, impressum.html und kontakt.html geschrieben, die wir ebenfalls im Ordner 'tpl' ablegen.All diese Dateien könnt Ihr euch hier herunterladen und anschauen.

Ihr werdet feststellen, dass die heruntergeladenen Dateien ein klein wenig von den Originaldateien abweichen, da hier die Verweise "gesäubert" wurden. Das ganze funktioniert mit dem Webserver-Modul Rewrite und macht die Seite im Internet besser auffindbar.
Wie man so etwas macht steht auf der mod rewrite-Seite. Für unsere Seite ändert damit die .htaccess-Datei auf dem Webserver URI's, wie z. B.:
http://php.nobs-nobody.de/simple/home/
in
http://php.nobs-nobody.de/simple/?page=home
Und das aus vor Allem zwei Gründen:Erstens kann Google und Co. mit   'http://php.nobs-nobody.de/simple/home/'   besser umgehen und zweitens kann man sich das besser merken.Damit können wir alle Verweise in der Form
http://<host>/<ordner>/<page>/
notieren, aber mit den GET-Parametern arbeiten, als hätte der Client
http://<host>/<ordner>/?page=<page>
angefordert.
Wichtig bleibt, dass die Dateien genau so heißen, wie wir sie in den Zeilen 44 bis 46 der Datei 'index.tpl.php' aufrufen, also genau so, wie die verschiedenen Werte von 'page',egal ob nun so, wie in den Originaldateien, oder so:
41|      <li><a href="http://php.nobs-nobody.de/simple/?page=home" ...
42|      <li><a href="http://php.nobs-nobody.de/simple/?page=impressum" ...
43|      <li><a href="http://php.nobs-nobody.de/simple/?page=kontakt" ...
Damit sind auch die PHP-Anweisungen in der Datei 'index.tpl.php' schnell erklärt.
Der Wert von 'page' wird in Zeile 132 mit der Funktion print() als Überschrift ausgegeben. Allerding wird dieser Wert voher noch so gändert, dass er einen großen Anfangs- und kleine weitere Buchstaben besitzt. Erreicht wird das mit der Funktion ucfirst(). Zwei Funktionen, die also "ineinander geschachtelt" sind, werden nacheiander (von innen nach außen) ausgeführt, erst ucfirst() dann print().
132|      <?php print(ucfirst($request["page"])); ?>
In Zeile 136 wird eine Datei eingebunden, die genauso heißt, wie der Wert von Page und die Endung '.html' hat.
136|      <?php require("tpl/".$request["page"].".html"); ?>
Wir reagieren damit also genau auf den Request des Clients, der auf einen der Links in Zeile 44 - 46 klickt. Auf diese Art braucht man den HTML-Quellcode für Header, Navigation und "Inhalts-Rahmen" nur einmal schreiben - in der index.tpl.php - und lädt je nach Anforderung des Clients unterschiedliche Inhalte, aus den HTML-(Template-)Dateien home.html, impressum.html, kontakt.html usw.

Passt Endung und Dateinamen (und damit page-Werte) einfach an Eure Bedürfnisse an.

Noch dynamischer

Nachdem wir im ersten Teil gesehen haben, wie man PHP einfach einsetzt, folgt jetzt eine tiefer gehende Dynamisierung unserer Webseite.

Die drei Verweise:
41|      <li><a href="http://php.nobs-nobody.de/simple/home/" ...
42|      <li><a href="http://php.nobs-nobody.de/simple/impressum/" ...
43|      <li><a href="http://php.nobs-nobody.de/simple/kontakt/" ...
in der index.tpl.php aus dem ersten Teil dieser Seite, schlagen fehl, wenn im Ordner 'tpl' eine der entsprechenden HTML-Dateien nicht existiert (oder ihr Name einfach nur falsch geschrieben wurde).
Zusätzlich müssen wir jedes Mal, wenn wir eine neue Seite erstellen wollen, ein neues Template erstellen (z. B. galerie.html) und im Main-Template einen Verweis darauf setzen. Viel einfacher wäre es doch aber, wenn wir nur das Template erstellen und fertig.Das ist zugegebenermaßen nur ein trivialer Grund, versetzt uns aber in die Lage, uns Dateioperationen mittels PHP und vor allem die Erstellung eigener Funktionen (immerhin ist PHP eine prozedurale Sprache) etwas genauer anzuschauen.

Wir legen uns im Ordner unserer Webseite einen neuen Ordner namens 'func' an und legen dorthinein eine Datei 'functions.inc.php'.In die Datei kommt fogender Code:
<?php
// ließ alle Template-Datenamen im übergebenen Ordner aus
function readTemplates($dirName) {
    // Verzeichnishandle erstellen
    $directory = opendir($dirName);    // Dateinamen einzeln auslesen
    while ($fileName = readdir($directory)) {
        // wenn Dateiname '.' oder '..'
        if ($fileName == '.' || $fileName == '..') {
            //nimmt die nächste Datei
            continue;
        }
        // wenn Datei mit der Endung '.html'
        if (strtolower(substr($fileName, strrpos($fielName, '.')) == ".html") {
            // Dateinamen (ohne Endung) in einem Array speichern
            $files[] = substr($fileName, 0, strrpos($fileName, '.'));
        }
    }
    // Verzeichnishandle schließen    closedir($directory);
    // templates zurückgeben
    return $files;
}?>
Jetzt müssen wir noch in der Datei index.php in unserem Verzeichnis eine kleine Änderung durchführen:
<?php
// client request klonen
$request = $_REQUEST;
// functions einbinden
require("func/functions.inc.php");
// templates lesen
$templates = readTemplates("../tpl/");
// alphabetisch sortieren
sort($templates, SORT_STRING);

// standard wert für page setzen wenn, im client request keiner oder ein falscher gesetzt ist
if (empty($request["page"]) || !in_array($request["page"], $templates)) {
    $request["page"] = "home";
}
// html code einbinden
require("tpl/index.tpl.php");
?>
und in der Datei index.tpl.php im Ordner 'tpl' die eigentliche Dynamisierung durchführen. Die drei Verweise ersetzen wir durch:
40|    ...
41|    <?php
42|    // für jede Template-Datei
43|    foreach ($templates as $template) {
44|        // einen Verweis erstellen
45|        print("<li><a href=\"http://php.nobs-nobody.de/simple/".$template."/\">");
46|        print(ucfirst($template)."</a></li>\n");
47|    }
48|    ?>
49|    ...
Damit haben wir die Seite weiter "dynamisiert", denn mit jeder neu angelegeten Datei im Ordner 'tpl' , die die Endung '.html' hat, wird im Main-Template und damit auf der Webseite automatisch ein neuer Verweis in der Navigation erstellt.