PHP-Programmierung Steuerung von Programmen: Beispiel

Praxisbeispiel: config.php

Viele Programme in PHP sollen sowohl im Web als auch auf dem Localhost laufen. Da dieses Vorhaben unterschiedliche Werte benötigen, schon alleine, wenn man Seiten aufrufen will, muss man zwischen Localhost und Web unterscheiden. Die Frage ist, wie man dies das Programm selbst finden lassen kann!

In diesem Artikel geht es um eine flexible Anbindung eines PHP-Programms für verschiedene Anwendungen. Als Beispiel stellen Sie eine config.php-Datei zusammen, die automatisch auf die Gegebenheiten reagieren kann. Folgen Sie mir also einem Beispiel, dass Sie – auf Ihre Bedürfnisse angepasst – auch in Ihren Programmen anwenden können.

config.php

Diesen Dateinamen finden Sie in fast allen Programmen, die in PHP geschrieben sind. Sie enthält zum einen Konstantenbewertungen und globale Werte und wird in allen anderen Programmen eines PHP-Programms eingebunden. Wir werden diese Datei nach und nach entwickeln und vervollständigen.

Supergobale Variablen in PHP

Superglobale Variablen in PHP sind von PHP vordefinierte Variablen, die Sie immer und überall anwenden können. Diese enthalten Daten und Bewertungen, die bei der Programmierung unendlich nützlich sein können.
Machen Sie sich doch ein kleines Beispielprogramm und schreiben:

print(„<br />Superglobale Variable SERVER:<br /><pre>“);
var_dump($_SERVER);
print(„</pre><br />“);

Lassen Sie dieses Programm laufen und sie herhalten eine Liste aller Inhalte, dieses superglobalen Feldes $_SERVER. [Da ich hier im Blogartikel PHP-Anschluss habe, könnte ich die momentane Belegung der Variable ausgeben! Damit würde ich aber eigentlich geheime Bewertungen meines Blogs ausgeben, deswegen schreiben Sie bitte das obige Programm, oder laden Sie die Beispieldatei herunter.]
Sie sehen hier Angaben wie

[„MYSQL_HOME“]=>
string(16) „\xampp\mysql\bin“

Die superglobale Variable $_SERVER ist ein sog. assoziativer Array und mit $_SERVER[„MYSQL_HOME“] ist die Komponente „MYSQL_HOME“ angesprochen, die einen Wert von 16 Zeichen hat.

Am unteren Ende der Textdatei oder Ihrer Ausgabe sehen Sie den Eintrag [„SERVER_ADDR“] mit dem Wert „127.0.0.1“. Diese sagt uns, dass wir das Programm auf dem Localhost haben laufen lassen. Und genau diese Information ist jetzt wichtig für unser Vorhaben der Steuerung.

Es gibt aber noch eine ganze Reihe anderer superglobaler Variablen, die Sie mit entsprechend abgeänderten Programmbeispiel auch anlisten können.

Variable Bedeutung Beispiel
$GLOBALS Alle globalen Variablen $GLOBAL[„x“]
$_GET GET-Parameter aus URL $_GET[„x“]
$_POST POST-Parameter aus Formular $_POST[„x“]
$_COOKIE COOKIE vom Browser (eigene) $_COOKIE[„x“]
$_FILES Geladene Dateien $_FILE[„x“]
$_ENV Umgebungsvariablen des Servers $_ENV[„x“]
$_SESSION Sessionvariablen der Sitzung $_SESSION[„x“]

Zurück zur config.php

Wir wollen also abfragen, ob wir auf dem Localhost sind und danach dann die zuständigen Werte vergeben, andernfalls die Werte vom Web vergeben. Also brauchen wir eine Abfrage

$G_IS_LOCAL = FALSE;
if ($_SERVER[‚SERVER_ADDR‘] == „127.0.0.1“ ) {
  $G_IS_LOCAL = TRUE; //localhost
}
if($G_IS_LOCAL) {
  define(„APPL_IS_LOCAL“,true);
  //…… hier kommen alle Zuweisungen für den Localhost hin
} else {
  define(„APPL_IS_LOCAL“,false);
  //…… hier kommen alle Zuweisungen für das Web hin
}

Wir haben also eine von uns definierte Variable $G_IS_LOCAL, die uns angibt, dass das Programm auf dem Localhost läuft. Außerdem definieren wir uns noch eine Konstante APPL_IS_LOCAL, die entsprechend true oder false ist. Jetzt können wir überall im Programm auf unsere Konstante APPL_IS_LOCAL oder die Variable $G_IS_LOCAL zugreifen, wenn config.php in das Programm eingestellt wurde. Was ja mit der Anweisung include config.php funktionieren würde.

NEU:Änderung, wenn obiges nicht funktioniert

Es könnte sein, dass aufgrund von Servereinstellungen ihres Providers, das obige Coding nicht oder nicht mehr funktioniert. Dann können Sie es abändern in

$G_IS_LOCAL = FALSE;
if (substr($_SERVER[‚DOCUMENT_ROOT‘],0,10) <> „/is/htdocs“ ) {
  $G_IS_LOCAL = TRUE; //localhost
}
if($G_IS_LOCAL) {…. }

Dazu müssen Sie aber wissen, wie das sog. Root-Verzeichnis Ihres Webspaves heisst. Das erfahren Sie entweder im FileZilla oder durch Ausgabe des Wertes von $_SERVER[‚DOCUMENT_ROOT‘], wenn Sie ein Testprogramm auf dem Webspace laufen lassen.

Wo bin ich

Wichtiger ist aber nicht, ob wir auf dem Localhost sind oder nicht, sondern, ob welche Dateinamen gelten. Sie können ja im Web andere Verzeichnisse definiert haben, als auf dem Localhost.
Warum, fragen Sie!
Nun, nehmen wir Ihren WordPressblog, auch er hat eine config.php, die allerdings anders aussieht als hier beschrieben. Sie können aber mit den PHP-Kenntnissen aus diesem Artikel ihren Blog auch auf dem Localhost laufen lassen, ohne 2 Versionen der Datei config.php auf dem Web und auf dem Lokalhost zu halten! Ist das nicht ein Vorteil? [vgl: Blog-Datenbank auf Web und Localhost]

Kommen wir zurück zu unterschiedlichen Verzeichnissen im Web und Localhost: Dazu müssen Sie sich für Ihre PHP-Anwendungen eine immer beizubehaltende Dateistruktur definieren. Diese Struktur hilft Ihnen selbst, bei vielen Dateien selbst durchzublicken und nicht alles offen zu zeigen.

Bei allen Anwendungen in PHP gibt es immer wieder Dateien, die Sie öfters benötigen, oder die für alle Komponenten der Anwendung gelten. Dies sind z.B. Unterprogramme, die etwas von der Datenbank lesen sollen, oder etwas auf den Benutzerschirm schreiben sollen. Normalerweise wird man diese Programme sammeln und in eine eigene Routine stecken. Da sie von allen Programmen benötigt werden, könnte man sie in ein Verzeichnis common legen. Dazu gehören dann auch Bilder, Javascript-Routinen etc. Sammeln Sie alle diese Dinge in einer Verzeichnisstruktur:

…./common
…./common/images/
…./common/includes/
…./common/includes/classes
…./common/includes/functions
…./common/includes/languages
…./common/javascript/

Die Datei config.php ist nun Bestandteil des Verzeichnisses …/common/includes/! Also sollte sie auch genau dort gespeichert werden.
Nehmen wir weiter an, unsere PHP-Anwendung solle heißen bestellung
Sie sei im Web auf www.bestellung.de gespeichert. Auf dem Localhost soll das Verzeichnis bestellung heißen.
Die Startdatei für das Web und dem Localhost soll index.php heißen.

Daraus folgen dann folgende Aufrufe:
Im Web: http://www.bestellung.de und
auf dem Localhost:http://localhost/bestellung

In PHP müssen wir aber nicht nur die URLs für Links benutzen, sondern auch die echten Dateinamen, um z.B. Dateien zu inkludieren!

Jetzt müssen alle Links im Programm im Web vollqualifiziert http://www.bestellung.de/programxx.php heißen. Auf dem eigenen PC aber http://localhost/bestellung/programmxx.php! Wir könnten also im config.php festlegen:
Ist Localhost, dann soll die Konstante APPL_ROOT_SITE den Wert http://localhost/bestellung/ lauten, im Falle des Web hätte die Konstante den Wert http://www.bestellung.de/
Was aber, wenn wir einen anderen Ort für diese Anwendung vergeben? Dann müssen wir händisch die Anpassungen machen und config.php jedes Mal ändern.

Halten wir aber fest, dass die Datei config.php immer unter …./common/includes/config.php gespeichert ist, so müsste sich mit dieser Information etwas anfangen lassen, oder?

Dateinamen finden

Es gibt eine Funktion in PHP, die den Ort einer Datei ausgibt. Diese Funktion heißt __FILE__! Sie stellt mit ihren doppelte Unterstrichen eine von vielen sog. magischen Konstanten in PHP dar [vgl: PHP-Manual(language.constants.predefined)]

Mit $h = __FILE__; in der config.php bekommen wir in der Variablen $h dann ggf. den Wert „D:\01_htdocs\bestellung\common\includes\config.php“
Im Web steht dann in $h z.B. „usr/mueller/htdocs/www.bestellung.de/common/includes/config.php“
Was ist hier konstant? Sie erkennen doch gleich den String „/common/includes/config.php“, oder?
Das bedeutet doch, wenn Sie in der Variable $h den String „/common/includes/config.php“ löschen, dann hat man den richtigen Wert der Datei!
Also führen wir doch genau dieses durch: [zu der Funktion str_replace vgl. PHP-Manual(str_replace)]

$h = __FILE__;
// wegen Windows alle backslashes zu slashes !
$h = str_replace(‚\\‘,’/‘,$h).’/‘;
$h = str_replace(‚/common/includes/config.php‘,“,$h);

Jetzt steht in $h genau der Wert, den wir wollen und können diesen über eine Konstante festhalten: define(„APPL_PATH_ROOT“,$h); Hierzu brauchen wir keine Unterscheidung, ob Web oder Localhost! Anders ist es bei den Webadressen. Hier hilft, wie ein Blick in die superglobale Variable $_SERVER zeigt die Komponente PHP_SELF
Mit $_SERVER[„PHP_SELF“] haben wir den Wert /bestellung/index.php im falle des Localhosts. Im Web haben wir dann /www.bestellung.de/index.php! Oder eine andere aufgerufene Seite!
Mit der Funktion dirname($_SERVER[„PHP_SELF“]) schneidet man den Dateinamen (hier index.php) aus dem Verzeichnis heraus und es bleibt /bestellung/ bzw. /www.bestellung.de/!
Also fragen wir folgendes ab:

$G_IS_LOCAL = FALSE;
if ($_SERVER[‚SERVER_ADDR‘] == „127.0.0.1“ ) {
  $G_IS_LOCAL = TRUE; //localhost
}
// abschneiden anfänglichen Slash /1)
$w = „/“.dirname($_SERVER[„PHP-SELF“]);
$w = str_replace(„//“,““,$w);
if($G_IS_LOCAL) {
  define(„APPL_IS_LOCAL“,true);
  define(„APPL_ROOT“, „http://localhost“.$w);
} else {
  define(„APPL_IS_LOCAL“,false);
  define(„APPL_ROOT“, „http://“.$w);
}

Jetzt haben wir fast alles, was wir benötigen und können mit

//Linkkonstanten der Anwendung
define(„APPL_LINK_FUNCTIONS“, APPL_ROOT.“common/includes/functions/“);
define(„APPL_LINK_IMAGES“, APPL_ROOT.“common/images/“);
define(„APPL_LINK_CLASSES“, APPL_ROOT.“common/classes/“);
//Dateinamen der Anwendung
define(„APPL_PATH_FUNCTIONS“, APPL_PATH_ROOT.“common/includes/functions/“);
define(„APPL_PATH_IMAGES“, APPL_PATH_ROOT.“common/images/“);
define(„APPL_PATH_CLASSES“, APPL_PATH_ROOT.“common/classes/“);

für die gesamte Anwendung Konstanten für die vollqualifizierten Verzeichnisnamen und Links anbieten.

Alle Programme sei es index.php oder irgend ein anderes sehen dann folgendermaßen aus:

<?PHP
define(„APPL_VALID_VAR“,“OK“);
include config.php;
include APPL_PATH_FUNCTIONS.kernel.php;
…..

Codesicherung

Sie fragen sich was das anfänglich define soll? Das ist eine Code-Sicherung, die alle direkten Aufrufe von Seiten sperren soll.
In allen includes – wie auch in config.php wird als erstes eine Zeile

<?PHP
defined(„APPL_VALID_VAR“) or die( ‚Der direkte Zugriff zu config.php ist nicht erlaubt.‘ );

aufgenommen. Erfolgt jetzt ein Aufruf mit http://www.bestellung.php/common/includes/config.php in der Adresszeile des Browsers, dann erfolgt sofort eine Fehlermeldung:
Der direkte Zugriff zu config.php ist nicht erlaubt.
In alle Include-Dateien und Funktionsdateien wird dieser defined aufgenommen. Nur die eigentlich aufrufbaren Programme wie index.php oder bestell.php würden die Konstante APPL_VALID_VAR definieren und könnten ausgeführt werden.

Fazit

Mit der hier besprochenen config.php haben Sie also die Möglichkeit, zentral in einer Datei alle Konstanten für Links und Includes anzulegen, und dies unabhängig von der Seite, die Sie betreiben wollen. Es wird klargestellt, wo das PHP-Programm im Moment läuft ($G_IS_LOCAL und/oder APPL_IS_LOCAL). Außerdem können diese PHP-Seiten nicht direkt mit dem Browser aufgerufen werden, was man immer anwenden sollte, da man ansonsten Seiteneffekte haben könnte, die bis zur Zerstörung von Daten gehen können.

Die config.php ist noch lange nicht fertig, deshalb wird sie in einem späteren Artikel noch weiter vervollständigt und dann im allgemeinen auch zum Download angeboten.

Bis dahin, viel Erfolg
Bernd Klüppelberg

1) Trick für die Programmierung:
Wenn man sich nicht sicher ist, dass man immer am Anfang eines Strings das Zeichen / hat, dann erzeugt man zunächst einen am Anfang und löscht dann einen Doppelslash!
zurück

Bisher gibt es keinen Kommentar. Schreiben Sie einen Kommentar!

Schreibe einen Kommentar