Dynamische Webseiten-Generierung, Vorlesung 2

<- Vorlesung 1 Übungen Vorlesung 3 ->


7) Weitere Befehle zur Ablaufkontrolle

In 6) haben wir die erste Möglichkeit kennengelernt, eine Programm-Schleife zu erzeugen. Statt
	$t = "Ich soll meine Uebungsaufgaben selbst erstellen!<BR>\n";
	$i = 0;
	while ($i<10) {
		echo $t;
		$i++;
	}
kann man auch schreiben:
	$t = "Ich soll meine Uebungsaufgaben selbst erstellen!<BR>\n";
	$i = 0;
	do {
		echo $t;
		$i++;
	} while ($i<10); 
Was ist der Unterschied?
Man bemerkt den Unterschied, wenn z.B. statt $i=0; zu Beginn $i=10; gesetzt wird. Im ersten Fall ist die Bedingung ($i<10) nicht wahr und die Befehle innerhalb der geschweiften Klammern werden nicht ausgeführt.

Im zweiten Fall werden zuerst die Befehle innerhalb der geschweiften Klammern ausgeführt, danach wird getestet, ob ($i<10). Dies ist nicht der Fall, also wird abgebrochen. D.h. aber, die Schleife wird mindestens einmal durchlaufen.

Eine weitere Möglichkeit, eine Schleife zu programmieren, ist der for-Befehl. Gleich ein Beispiel:

	$t = "Ich soll meine Uebungsaufgaben selbst erstellen!<BR>\n";
	for ($i=0;$i<10;$i++) {
		echo $t;
	}
Der for-Befehl besteht aus drei Ausdrücken.
	for (ausdruck1;ausdruck2;ausdruck3) { ... }
Der for-Befehl hat den Vorteil, daß alle zur Kontrolle der Schleife nötigen Befehle in einer Zeile stehen. Ein weiteres Beispiel, diesmal wird heruntergezählt.
	$t = "Ich soll meine Uebungsaufgaben selbst erstellen!<BR>\n";
	for ($i=10;$i>0;$i--) {
		echo $t;
	}


8) Fallunterscheidungen

Zur Fallunterscheidung gibt es den if-Befehl:
	if ($i<0) {
		echo "$i ist kleiner als Null\n";
	} 
oder auch
	if ($i<0) {
		echo "$i ist kleiner als Null\n";
	} else {
		echo "$i ist nicht kleiner als Null\n";
	}
Man kann diesen Befehl auch schachteln:
	if ($i<0) {
		echo "$i ist kleiner als Null\n";
	} else if ($i>0) {
		echo "$i ist groesser als Null\n";
	} else {
		echo "$i ist Null\n";
	}
Hat man mehrere Tests der gleichen Variable, so kann man mit dem switch-Befehl evtl. Arbeit einsparen:
	switch ($name) {
		case "Heinrich":
			echo "Ich bin der kluge Heinrich";
			break;
		case "Hans":
			echo "Ich bin der dumme Hans";	
			break;
		case "Agathe":
			echo "Ich bin die Agathe und klüger als Heinrich und Hans";
			break;
		default:
			echo "Wir sind der Rest";
	}
Falls die Variable $name den Wert "Hans" hat, wird als nächster Befehl
	echo "Ich bin der dumme Hans";	
ausgeführt. Normalerweise würden dann alle nachfolgenden Befehle ausgeführt werden, u.a.
	echo "Ich bin die Agathe und klüger als Heinrich und Hans";
Dies ist meist nicht erwünscht, man springt deshalb mit break aus dem switch-Befehl heraus.


9) Weitere Vergleichsmöglichkeiten

Bisher konnten wir testen, ob $i<10 oder $i>10 gilt. Es gibt aber noch mehr Möglichkeiten: Man kann auch kombinieren:


10) Nochmals vordefinierte Variablen

In 4) haben wir gelernt, daß in einer PHP-Datei, die aus einem Formular gestartet wird, die Namen der Formular-Elemente als Variablen zur Verfügung stehen. Dies kann man nützen, um Formular und Befehle, die das Formular behandeln, in eine einzige Datei zu schreiben:

Angenommen unsere Datei form.html enthält folgendes Formular:

<FORM ACTION="form.html" METHOD=POST>
<INPUT NAME="beliebigername">
<INPUT TYPE="submit">
</FORM>
Dann ruft sich beim Klicken auf submit die Datei selbst auf. Allerdings ist dann die Variable beliebigername beliebiger Name gesetzt. Dies können wir folgendermaßen ausnützen:
<?
	if (isset($beliebigername)) {
		echo "Sie haben $beliebigername eingegeben\n";
	}
?>	
<P>	
<FORM ACTION="form.html" METHOD=POST>
<INPUT NAME="beliebigername">
<INPUT TYPE="submit">
</FORM>
Wird die Datei zum ersten Mal aufgerufen, d.h. ohne daß man auf den submit-Button klickt, so ist die Variable $beliebigername nicht gesetzt, der Ausdruck isset($beliebigername) ist also nicht wahr. Füllt man das Formular dann aus und klickt auf submit, so ist die Variable gesetzt, isset($beliebigername) ist wahr, und es wird "Sie haben $beliebigername eingegeben\n"; ausgegeben.

Will man danach abbrechen, so sollte der Befehl

 exit;
verwendet werden.


11) Dateien hinzuladen

Der Befehl
	include("dateiname");
liest den Inhalt der Datei dateiname so, als ob er an dieser Stelle stehen würde. Damit kann z.B. einheitliches Layout bei einer größeren Anzahl von Dateien erreicht werden.


12) Dateien lesen und schreiben

Wir wollen nun von Dateien, die auf dem Server liegen, lesen, bzw. in diese Dateien etwas hineinschreiben. Dies ist nützlich, um z.B. Zähler oder Gästebücher zu erzeugen.

Wichtig:
Aus Sicherheitsgründen ist der Webserver einem Benutzer auf dem Server-Computer zugeordnet, der sehr wenig Rechte hat. U.a. darf er nicht einfach in eine Datei in ihrem Verzeichnis schreiben. Genausowenig darf er eine Datei in Ihrem Verzeichnis erzeugen.

Um z.B. eine Datei xxx zu erzeugen, in die der Webserver schreiben darf, müssen Sie folgendermaßen vorgehen:

  • Verwenden Sie z.B. das Programm ws_ftp unter Windows 95 oder Windows NT, so kann man im ftp-Programm die Datei anwählen, auf die rechte Maustaste klicken und dann den Befehl chmod verwenden.
  • Steht der Befehl chmod nicht per Mausklick zur Verfügung, so kann man die Rechte dennoch mit einem ftp-Befehl eingeben: Der Befehl lautet
    	site chmod xyz DATEINAME
    
    x, y, z sind 3 Ziffern, die die Rechte für den Datei-Eigentümer, die Benutzergruppe des Datei-Eigentümers (das sind üblicherweise alle anderen Benutzer auf dem Computer) und den Rest der Welt bestimmen. Dabei gilt:
    • Jede der 3 Ziffern liegt zwischen 0 und 7.
    • 0 bedeutet: keinerlei Zugriffsrecht.
    • 1 bedeutet: Ausführrecht (wichtig bei Programmen und Verzeichnissen).
    • 2 bedeutet: Schreibrecht (was gleichzeitig auch "Löschrecht" ist).
    • 4 bedeutet: Leserecht.
    Der Clou an der Sache ist, daß die Zahlen addiert werden können: Will man einer Datei Lese- und Schreibrecht zuordnen, so ist die Zahl 2+4=6 anzugeben.

    Beispiele:

    	site chmod 777 DATEINAME
    
    gibt jedem das Recht, alles mit der Datei DATEINAME anzustellen.
    	site chmod 754 DATEINAME
    
    bedeutet, der Eigentümer darf alles mit der Datei anstellen, die Gruppe des Eigentümers darf die Datei ausführen und lesen, der Rest darf die Datei nur lesen.

    Achtung: Der Webserver läuft normalerweise unter "Rest", ist also weder der Eigentümer noch gehört er zur Gruppe des Eigentümers.

OK. Gehen wir davon aus, daß wir nun eine Datei mit dem Namen xxx haben, deren Inhalt wir lesen wollen.

  1. Zuerst müssen wir die Datei öffnen, dabei muß angegeben werden, was mit der Datei geschehen soll: Wollen wir lesen, schreiben, anhängen,...
    Der Befehl lautet
    	$datei = fopen("xxx","r");
    
    Das heißt, wir öffnen die Datei mit dem Namen xxx und wollen darin lesen ("r"). Die technischen Details lassen wir dabei von der Variablen $datei regeln, d.h. wenn wir später aus der Datei lesen wollen, so benützen wir die Variable $datei.
  2. Nun lesen wir zeilenweise den Inhalt der Datei, und zwar so lange, bis wir ans Ende der Datei gelangt sind:
    	while (!feof($datei)) {
    		$zeile = fgets($datei,1000);
    		echo $zeile;
    	}
    
    feof($datei) ist wahr, sobald wir an das Datei-Ende gelangt sind. $zeile = fgets($datei,1000); liest maximal die nächsten 1000 Zeichen, hört aber auf, sobald eine neue Zeile beginnt, oder das Ende der Datei erreicht ist.
    echo $zeile; gibt einfach das Gelesene wieder aus.
  3. Schließlich muß die Datei noch geschlossen werden:
    	fclose($datei);
    
Folgende Möglichkeiten gibt es, eine Datei zu öffnen: Mit dem Befehl
	fwrite($datei, "Ein Text");
kann der String Ein Text in die Datei geschrieben werden.


<- Vorlesung 1 Übungen Vorlesung 3 ->

Alfred.Wassermann@uni-bayreuth.de