Data Driven Websites mit PHPWeb-BaukastenKristian Köhntopp |
D |
./configure --with-mysql=/usr/local \ --with-pgsql=/usr \ --with-pcre \ --with-gd=/usr \ --with-ttf=/usr \ --with-png-dir=/usr \ --with-dbase=yes \ --with-config-file-path=. \ --enable-debug=no \ --enable-safe-mode=no \ --enable-url-fopen-wrapper=yes \ --enable-track-vars=yes \ --enable-force-cgi-redirectund ruft dann einfach make auf. Dabei wird eine Produktionsversion (ohne Debugcode) von PHP erzeugt, die die Datenbanken MySQL und Postgres unterstützt, dBase-Dateien lesen und über die GD-Bibliothek Grafiken erzeugen kann. Die Option - -enable-url-fopen-wrapper aktiviert außerdem die HTTP- und FTP-Downloadmöglichkeiten der Sprache und die Optionen - -enable-track-vars sowie - -enable-force-cgi-redirect sind für den sicheren Betrieb der Sprache als CGI-Modul notwendig. Das resultierende Binary wird einfach in ein CGI-Verzeichnis des Webservers kopiert. Dorthin ist auch die Datei php3.ini-dist aus dem Hauptverzeichnis der PHP3-Distribution zu kopieren und nach php3.ini umzubenennen. Die Datei enthält eine Reihe von Voreinstellungen für den PHP3-Interpreter, die für die jeweilige Anwendung angepasst werden können. Verwendet man, wie die meisten Leute, den Apache-Webserver, sind außerdem noch zwei Zeilen in der srm.conf des Servers einzutragen, die den PHP-Support aktivieren:
AddHandler php-cgi .php3 Action php-cgi /cgi-bin/phpDie erste Zeile bewirkt, dass für Dateien mit der Endung ".php3" die Server-Action php-cgi aufgerufen wird. Die zweite Zeile definiert diese Action als das CGI-Programm, das unter der URL /cgi-bin/php erreichbar ist. Apache-intern bewirkt dies ein einfaches Rewriting von URLs der Form /test.php3 nach /cgi-bin/php/test.php3.
Abb.1: test.php - Die Anweisung phpinfo() generiert eine detaillierte Bannerseite, die alle internen Konfigurationsvoreinstellungen und alle übergebenen Parameter anzeigt. |
Listing zu Bild1 : |
<html> <head><title>Testseite</title></head> <body bgcolor="#ffffff"> <?php phpinfo(); // Generierung einer Statusseite ?> </body> </html> |
Listing 2 - Parameterübergabe |
PHP3-Programmen stehen in den assoziativen Feldern $HTTP_GET_VARS, $HTTP_POST_VARS und $HTTP_COOKIE_VARS die Parameter des Programmaufrufes zur Verfügung <html> <head><title>Auslesen der Parameter</title></head> <body bgcolor="#ffffff"> <?php printf("<h1>Alle GET-Parameter</h1>\n"); if ( isset($HTTP_GET_VARS)) // Teste, ob überhaupt Parameter vorhanden sind. { reset($HTTP_GET_VARS); // Beginne am Anfang des Feldes // und gehe mit each() alle Feldelemente durch. while(list($k, $v) = each($HTTP_GET_VARS)) { // $k ist der Key, $v der Value<\#201> printf("Name: %s Wert: %s<br>\n", $k, $v); } } // Gezielter Zugriff auf ein einzelnes Element des Feldes. printf("Der Parameter name hat den Wert %s<br>\n", $HTTP_GET_VARS["name"]); ?> </body> </html> |
Die Kontrollstrukturen von PHP gleichen weitgehend denen von C, C++ oder Java |
if (bedingung) { Bedingungen anweisungen } else { anweisungen } if (bedingung): Alternative Schreibweise anweisungen else: anweisungen endif; while (bedingung) { While-Schleife anweisungen } while (bedingung): Alternative Schreibweise anweisungen endwhile; for (startanweisung; vergleich; zählanweisung) { anweisungen } switch ($variable) { Switch-Anweisung case konstante1: anweisungen break; case konstante2: anweisungen break; default: anweisungen break; } |
reset ($arrayname); while \ (list($k, $v) = each($arrayname)) { ... }Diese Anweisung liest das Array $arrayname elementweise durch. Der Index des aktuellen Elementes steht dabei in der Variablen $k zur Verfügung, sein Wert in $v. In PHP sind die Elemente eines assoziativen Arrays untereinanderdurch Zeiger verbunden, so dass eine Reihenfolge erhalten bleibt, auch wenn es sich eigentlich um einen Hash handelt, der bei der Ablage der Elemente im Speicher keine Reihenfolge definiert. Außerdem hat jedes Array intern einen Zeiger auf ein aktuelles Element, den man durch diese Liste bewegen kann. Die Anweisung reset($arrayname) stellt diesen internen Zeiger auf den Anfang des Arrays zurück. Die Funktion each($arrayname) liefert nun den Index und den Wert des aktuellen Elementes als Feld mit zwei Elementen zurück und schiebt den internen Zeiger aktuelle Elemente vorwärts. list($k, $v) wiederum erzeugt aus den beiden Variablen $k und $v ein weiteres Array mit zwei Elementen, aber in der Form von "lvalues", also von Zeigern auf Speicherplätzen, denen man Werte zuweisen kann. Der erste von each() zurückgegebene Wert wird also in $k abgespeichert, der zweite von each() zurückgegebene Wert in $v.
Listing 3 - Abfrage einer MySQL-Datenbank mit PHP |
<html> <?php // Verbindung zur Datenbank auf localhost als // User kris ohne Passwort. $link = mysql_connect("localhost", "kris", ""); // Auswahl der zu verwendenden Datenbank auf dem Server $query = "use poe_sessions"; if (!mysql_query($query, $link)) die("Datenbank poe_sessions existiert nicht.<br>\n"); // Auslesen der Tabelle auth_users in dieser Datenbank $query = "select username, password, perms from auth_users"; $res = mysql_query($query, $link); if (!$res) die("Anfrage $query scheitert.<br>\n"); // Bestimme Größe des Ergebnisses $rows = mysql_num_rows($res); $cols = mysql_num_fields($res); printf("Anfrage ergibt %d Zeilen zu %d Spalten.<br>\n", $rows, $cols); // Durchlesen des Ergebnisses while($d = mysql_fetch_array($res)) { // $d ist ein Array aus Spaltenname, aktuellem Wert reset($d); while(list($k, $v) = each($d)) { printf("%s = %s, ", $k, $v); } printf("<br>\n"); } ?> |
Listing 4 - Kein Cache bitte! |
Erzeugen einer Seite, die nicht gecacht werden darf: In einer Datenbanktabelle werden Seitenabrufzähler hinterlegt. <?php header("Expires: 0"); // Netscape Browser Cache header("Pragma: no-cache"); // HTTP/1.0 Cache // HTTP/1.1 Cache header("Cache-Control: no-cache, no-store, must-revalidate"); // Link aufbauen $link = mysql_connect("localhost", "kris", ""); mysql_query("use poe_sessions", $link); // Zähler hochzählen $query = sprintf("update page_counter set counter = counter +1 where pagename = '%s'", $PHP_SELF); $res = mysql_query($query, $link); $success = mysql_affected_rows($link); // Wenn der Zähler noch nicht existierte, anlegen. if (!$success) { $query = sprintf("insert into page_counter ( pagename, counter) values('%s', '1')", $PHP_SELF); mysql_query($query, $link); } // Zählerstand abfragen $query = sprintf("select counter from page_counter where pagename = '%s'", $PHP_SELF); $res = mysql_query($query, $link); $d = mysql_fetch_array($res); $counter = $d["counter"]; ?> <html> <body bgcolor="#ffffff"> <h1>Seitenzähler</h1> Diese Seite wurde <?php print $counter ?> mal aufgerufen. </body> </html> |
Listing 4a - Anlegen einer Datenbankstelle |
kris<\@>valiant:/home/kris > mysql poe_sessions Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 29 to server version: 3.21.33 Type 'help' for help. mysql> create table page_counter ( -> pagename varchar(127) not null, -> counter integer, -> primary key (pagename) -> ); Query OK, 0 rows affected (0.00 sec) mysql> describe page_counter; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | pagename | varchar(127) | | PRI | | | | counter | int(11) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> quit |
/ - home - www - servers -> -> www.koehntop.de ------ pages ------ cgi ------ php
Listing 5 - Erweiterung des Seitenzähler-Codes aus Listing 4: |
Definition von zwei Funktionen zum Zählen von Seitenzugriffen. Der
Code sollte als Datei count.inc im PHP-Includeverzeichnis (siehe Text)
abgelegt werden.
Definition von zwei Funktionen zum Zählen von Seitenzugriffen. Der Code sollte als Datei count.inc im PHP-Includeverzeichnis (siehe Text) abgelegt werden. <?php function count_page() { global $PHP_SELF; header("Expires: 0"); header("Pragma: no-cache"); header("Cache-Control: no-cache, no-store, must-revalidate"); $link = mysql_connect("localhost", "kris", ""); mysql_query("use poe_sessions", $link); $query = sprintf("update page_counter set counter = counter +1 where pagename = '%s'", $PHP_SELF); $res = mysql_query($query, $link); $success = mysql_affected_rows($link); if (!$success) { $query = sprintf("insert into page_counter ( pagename, counter) values('%s', '1')", $PHP_SELF); mysql_query($query, $link); } } function page_counter($pagename = "") { global $PHP_SELF; if ($pagename == "") $pagename = $PHP_SELF; $link = mysql_connect("localhost", "kris", ""); mysql_query("use poe_sessions", $link); $query = sprintf("select counter from page_counter where pagename = '%s'", $pagename); $res = mysql_query($query, $link); $d = mysql_fetch_array($res); return $d["counter"]; } // count_page einmal aufrufen count_page(); |
Listing 6: Anwendung des Seitenzählers aus Listing 5 |
<?php require("count.inc") ?> <html> <body bgcolor="#ffffff"> <h1>Seite mit Zähler</h1> Diese Seite wurde bisher <?php page_counter() ?> mal aufgerufen.Die Seite <tt>/blafasel.html</tt> wurde bisher <?php page_counter("/blafasel.html") ?> mal aufgerufen. </body> </html> |
Infos |
[1] Die PHP Website enthält den Source und Binärdistributionen zum Download sowie Dokumentation und Support. (weltweit) http://www.php.net (Deutschland) http://www.php3.de [2] Die Entwickler von PHP3. http://www.php.net/credits.php3 [3] Die Website von TCX, den Entwicklern von MySQL, hat die URL http://www.tcx.se. [4] Die FreeODBC Homepage, http://users.ids.net/~bjepson/freeODBC/ [5] The Boutell Website http://www.boutell.com/ [6] PHPLIB ist eine Bibliothek mit nützlichen Funktionen zur Erstellung von Webanwendungen http://phplib.shonline.de/ [7] Häufig gestellte Fragen in de.comp.lang.php http://www.koehntopp.de/php/ [8] Weitere Informationen zu PHP http://www.koehntopp.de/kris/artikel/ |
Copyright © 2000 Linux New Media AG