KAPITEL 4

Transcrição

KAPITEL 4
KAPITEL 4
Interaktive
Programmierung
HTML-Formulare und PHP •
Gästebuch •
Blackjack •
Funktionsplotter •
Chat •
Forum •
Dateibasierter Einkaufskorb •
KAPITEL 4
Internet ist Kommunikation und Interaktion. Der Reiz von PHP liegt im
Austausch von Information zwischen dem Besucher und der Homepage.
Wenn im vorherigen Kapitel die Inhalte zumeist Monologe waren, das
heißt, der Besucher keinen Einfluß auf den Programmablauf hatte, setzen
wir uns in diesem Kapitel mit dem Dialog auseinander und werden Informationen verarbeiten und HTML-Formulare auswerten.
4.1
HTML-Formulare und PHP
Im folgenden HTML-Formular sind der Großteil aller erlaubten HTML-Tags
in Formularen und die zugehörigen Parameter gemäß HTML 4.0 dargestellt:
Listing 4.1: Scripte einfache Programmierung\formular.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>MyForm</title>
<script language="javascript" type="text/javascript">
function java() {
document.MyForm.submit();
};
</script>
</head>
<body>
<!-- Formular-definition -->
<form action=htmlphp.php method=post name="MyForm"
target="frame1" onSubmit="" enctype="multipart/form-data">
<!-- mögliche Typen -->
<!-- Textfeldtypen -->
<fieldset>
<legend><b>Textfeldtypen</b></legend>
<table width="100%" border=1>
<tr><td>Text:</td>
<td><input type=text name="text" value="text" size=40 maxlength=40
readonly tabindex=7 disabled></td></tr>
<tr><td>Password:</td>
<td><input type=password name="password" value="pw"
maxlength=10 size=10></td></tr>
<tr><td>Textarea:</td>
<td><textarea name="textarea" rows=5 cols=40 disabled>
Textvorbelegung</textarea></td></tr>
<tr><td>Versteckt:
<td><input type=hidden name="hidden" value="heimlich"></td></tr>
</table>
</fieldset>
170
PHP 4
INTERAKTIVE PROGRAMMIERUNG
<!-- Auswahltypen/Menue -->
<fieldset>
<legend><b>Auswahltypen</b></legend>
<table border=1 width="100%"><tr><td width="50%">
Auswahlfeld Multiple:<br>
<select name="selectmultiple[]" size=4 multiple>
<optgroup label="label1">
<option value="A11" disabled> Auswahl 11
<option selected value="A12"> Auswahl 12
<option selected value="A13"> Auswahl 13
</optgroup>
<optgroup label="label2">
<option value="A21"> Auswahl 21
<option value="A22" disabled> Auswahl 22
<option selected value="A23"> Auswahl 23
</optgroup>
</select><br>
Auswahlfeld Normal:<br>
<select name="selectnormal1" size=3>
<optgroup label="label">
<option value="A1" disabled> Auswahl 1
<option selected value="A2"> Auswahl 2
<option selected value="A3"> Auswahl 3
</optgroup>
</select><br>
</td>
<td width="50%">
Radiobutton:<br>
<input type=radio name="rad1" value="alt1" disabled> wert1<br>
<input type=radio name="rad1" value="alt2" checked> wert2<br>
<input type=radio name="rad1" value="alt2"> wert2<br>
Checkboxen:<br>
<input type=checkbox name="CB1[]" value="opt1" disabled> Option 1<br>
<input type=checkbox name="CB1[]" value="opt2" checked> Option 2<br>
<input type=checkbox name="CB1[]" value="opt3"> Option 3<br>
</td></tr>
</table>
</fieldset>
<fieldset>
<legend><b>Dateiupload</b></legend>
<input type=file size=50 maxlength=100000 name="Datei" accept="text/*">
</fieldset><br>
<!-- Buttontypen -->
<fieldset>
<legend><b>Befehlsschaltflächen</b></legend>
<input type=button name="B1" value="Zurück" onClick="java()" tabindex=6>
<input type=button name="B1" value="Vor" onClick="submit()" tabindex=5>
<input type=submit name="B2" value="Submit1" tabindex=4 disabled>
<input type=submit name="B2" value="Submit2" tabindex=3>
<input type=reset name="B2" value="Reset" tabindex=2>
PHP 4
171
KAPITEL 4
<button name="B3" type="button" tabindex=1 accesskey="p" value="go
back" onClick="submit()">
<img src="php.gif" alt="Klickbild">
press Alt-'p'
</button>
<input type=image src="php.gif" name="B4" value="Submit4"
accesskey="s" alt="image">
</fieldset>
</form>
</body>
</html>
Weiter unten finden Sie eine Kurzbeschreibung der HTML-Syntax für dieses Formular.
Zuvor jedoch zwei wichtige Links zum Thema HTML:
»www.w3.org«: Adresse des World-Wide-Web-Consortiums, das die oberste Instanz für Definitionen und Konventionen des Internets darstellt. Hier
finden Sie alle Standards über Protokolle und Sprachen detailliert
beschrieben.
Dort, unter »http://validator.w3.org/check« befindet sich ein HTML-Syntax-Check, der beliebige HTML-Seiten Ihrer Homepage auf gültige Syntax
überprüft und auch die Fehler anzeigt. Obiges Script lieferte »nur« noch
den Fehler, daß im <form>-Tag ein name=-Parameter nicht bekannt sei.
Das trifft zu, denn er ist ein Teil der Definition des Browser-DocumentObjekts.
»www.teamone.de/selfaktuell/«: Adresse der Homepage von Stefan Münz,
der das Dokument SelfHTML sein eigen nennt. Es ist die wohl beste und
umfassendste deutsche Beschreibung von HTML. Er geht insbesondere
auch auf die Unterlassungen der Marktführer in der Umsetzung der von
WC3 vereinbarten HTLM Sprachelemente ein.
Zum obigen HTML-Script dennoch eine kurze Erklärung:
JavaScript: die Funktion Java() ruft die Methode submit() des Objekts
MyForm auf, das weiter unten als Formular erzeugt wird.
Zwischen <form..> und </form> stehen alle Formularelemente.
Hier die Parameter des einleitenden <form>-Tags:
action=, der Name der Datei, die den Inhalt des Formulars verarbeiten
soll.
method=, in der Regel Post, mit Get werden die Inhalte mit der URI übergeben, was schon aus optischen Gründen vermieden werden sollte.
name=, optional, aber sinnvoll bei JavaScript.
target=, bestimmt den Frame oder mit _blank eine neue Browserinstanz.
172
PHP 4
INTERAKTIVE PROGRAMMIERUNG
onSubmit ist ein möglicher Java-Event-Handler.
enctype=, Kodierungs- beziehungsweise Dekodierungstyp der Formulardaten.
<fieldset>..</fieldset> erzeugt einen Rahmen (nur MSIE). Mit
<legend>Name</legend> wird ein Titel im Rahmen gezeigt (nur MSIE).
<table>...<table> sorgt für die Abbildung des Formulars innerhalb der
Tabelle.
<tr> </tr> umkleidet hierbei eine Zeile, innerhalb derer mit <td> </td> Zellen erzeugt werden.
<input type=text..> erzeugt ein Texteingabefeld.
<input type=password..> erzeugt ein Passwortfeld, bei dessen Ausfüllen »*«
Sterne angezeigt werden.
<textarea name="textarea"...>Text</textarea> erzeugt ein mehrzeiliges Eingabefeld. Mit wrap= kann das Verhalten des Zeilenumbruchs eingestellt
werden. Bei <textarea> gibt es keinen value-Parameter. Die Vorbelegung
kommt zwischen Start- und Endtag.
<input type=hidden...> erzeugt ein verstecktes Formularelement, das zur
Speicherung und Versenden von weiteren Daten verwendet werden kann.
Die kann zum Beispiel eine Mitglieds- oder Warenkorbnummer sein, aber
auch Werte aus der Browserumgebung, beispielsweise »navigator.appName«.
<select ..> </select> umschreibt ein Auswahlfeld. Dies ist entweder »normal« oder »multiple«. Das heißt, der Besucher kann mittels gedrückter
[Strg]-Taste eine oder mehrere gebotene Optionen auswählen und absenden. Der name-Parameter muß dann durch die eckigen Klammern »[]« als
Array definiert werden, sonst erhält PHP immer nur die zuletzt gewählte
Option. Mit size= wird maßgeblich über die Anzahl der Zeilen des Optionsfeldes auch sein Verhalten bestimmt. Mit size=1 erzeugt man ein sogenanntes Drop-down-Feld mit einem Pfeilbutton zum Öffnen; mit size>=1
eine Auswahlliste innerhalb einer Box mit vertikalem Scrollbalken, sofern
erforderlich (size ist kleiner als die Anzahl der Optionen).
Unter Verwendung von »multiple« ist eine Nullauswahl möglich, ohne den
Zusatz »multiple« hingegen nicht.
<input type=radio...> bietet eine Auswahl von Alternativen. Der funktionale
Zusammenhang einer Radio-Button-Gruppe wird über den gleichnamigen
Parameter name= hergestellt. Es muß minimal eine Alternative gewählt
werden.
<input type=checkbox...> bietet eine Auswahl von Optionen, Mehr- und
Nullauswahl ist erlaubt. Der mit Name angegebene Wert soll mit den eckigen Klammern ein Array in PHP realisieren.
PHP 4
173
KAPITEL 4
<input type=file .. dient zum Datei-Upload. Der Encoding-Typ des Formulars muß dann multipart/form-data sein; das von action benannte und mit
submit() gerufene Script muß den Datenstrom verarbeiten.
<input type=button ...> Dieser Button muß entweder eine JavaScript-Funktion rufen, die mittels submit() oder per get (location.href=xy.php?parameter=...) ein anderes Script (PHP/Perl etc.) aufruft, oder wie gezeigt gleich
im Tag die submit()-Funktion auslösen. Ersteres bietet die Chance, die Eingaben vor dem Absenden mittels Java zu überprüfen.
<input type=submit...> sendet die Daten direkt über submit() ab. Es darf im
Formular beliebig viele solcher Buttons geben. Bei Gleichnamigkeit wird
im aufgerufenen Script value zum Inhalt der Variablen, die mit name=
benannt wurde.
<input type=reset..> setzt die Formularfelder wieder auf die Voreinstellungen, also die Werte vom value=-Parameter.
<button type="button"...> bietet einiges an Möglichkeiten, funktioniert aber
leider nur mit dem MSIE.
<input type=image...> ist immer ein Submit-Button und funktioniert bei
»ähnlicher« Visualisierung wenigstens mit Netscape 4.7 und MSIE 5.01.
Allgemeines zu einigen Parametern:
size= beschreibt die Größe im Browserfenster, während maxlength= die
maximale Zeichenkettenlänge bestimmt.
readonly und disabled zum »Ausgrauen« funktionieren bei Netscape 4.7
prinzipiell nicht, während der MSIE diesen Wert nur beim <select..>-Tag
ignoriert.
<fieldset>..</fieldset> und <label></label> werden von Netscape ignoriert.
Der Parameter accesskey funktioniert nicht mit Netscape 4.7.
Sofern Sie also Programmteile Ihrer Homepage von diesen Parametern
und Tags abhängig machen, weil Sie meinen, HTML 4.0 wäre ein bindender Standard, laufen Sie Gefahr, daß die logischen Abläufe Ihrer Webanwendung unsicher werden. So ist beispielsweise ein mit disabled ausgeschalteter Button unter Netscape noch funktionstüchtig, während MSIENutzer ihn nicht mehr verwenden können.
Wirkungen in PHP:
name=, der in einem Formularelement angegebene Wert korrespondiert
bei Aufruf eines PHP-Scriptes aus dem Formular umgehend mit einer entsprechenden gleichnamigen Variable in PHP. Der Wert der Variable ist
dann immer der letzte value von dem Feld bei Absenden des Formulars.
Ausnahmen: Bei Feldern mit möglicher Mehrfachauswahl (select mit »multiple« oder Typ »checkbox«) wird nur der zuletzt gewählte Wert an PHP
174
PHP 4
INTERAKTIVE PROGRAMMIERUNG
übergeben, wenn das zugehörige Formularelement im name=-Parameter
nicht mit eckigen Klammern als Array indiziert wird.
Die Auswertung in PHP muß dann natürlich auch auf ein Array abgestimmt sein.
So chaotisch das oben gezeigte Beispielformular wirken mag, ist es dennoch voll einsatzfähig und syntaktisch vom W3C überprüft. Hier ist die
Ansicht im MSIE:
Abb. 4.1:
Beispielformular
Die Auswertung erfolgt in einem separaten Script, das gemäß der actionAngabe im Form-Tag des Formulars »htmlphp.php« heißen muß:
Listing 4.2: Scripte einfache Programmierung\htmlphp.php
<?
// Ausgabe/Überprüfung des Beispiel-Formulares
echo "<u>Textfeldtypen: </u><br>";
echo "Textfeld = $text <br>";
echo "Password = $password <br>";
echo "Textarea = $textarea <br>";
echo "Hidden = $hidden <br>";
echo "<u>Auswahlfeldtype</u><br>";
PHP 4
175
KAPITEL 4
echo "Selectmultible:";
foreach ($selectmultiple as $option) echo "Option = $option,";
echo "<br>";
echo "Select normal: $selectnormal1<br>";
echo "Radiobutton: $rad1<br>";
echo "Checkbox:";
foreach ($CB1 as $option) echo "Option = $option,";
echo "<br>";
echo "Dateiupload: $Datei<br>";
echo " Dateiname: $Datei_name<br>";
echo " Dateitype: $Datei_type<br>";
echo " Dateigröße: $Datei_size<br>";
// Transfer der Datei aus dem Temp-Verz.
// in das Root des Servers nach dem Upload
@copy($Datei,$Datei_name);
echo "<u>Buttontypen</u><br>";
echo "Buttons B1:$B1<br>";
echo "Buttons B2:$B2<br>";
echo "Buttons B3:$B3<br>";
echo "Buttons B4:X:$B4_x, Y:$B4_y<br>";
?>
Das Script arbeitet die Felder des Formulars genau in der Reihenfolge der
Felder in der HTML-Datei ab.
Wichtig sind hier die Felder mit multiplen Auswahlmöglichkeiten – sie
werden als Array im empfangenden Script behandelt. Sie müssen als Programmierer überprüfen, welche und wie viel Optionen markiert wurden
und unter Umständen das Datenformat wandeln.
Das Datei-Upload bildet auch einige Besonderheiten ab: Die hochgeladene
Datei, hier »manual.html«, liegt bis zum Ablauf des Scriptes in einem temporären Verzeichnis des Servers. Nur während des Ablaufs können Sie
diese Datei mittels copy() an ihren Bestimmungsort bringen, danach ist
sie unweigerlich gelöscht. Akzeptieren Sie nie Dateien auf diese ungeprüfte Weise, sondern führen Sie Überprüfungen bezüglich des Inhalts
und eventuell der Größe durch. Der Upload mit mehreren Dateien in
einem Formular geschieht analog, nur daß Sie bei allen <input>-Tags den
Parameter name= identisch bezeichnen und eckige Klammern hinten
anstellen, also beispielsweise name="MyFiles[]". In PHP bilden sich durch
ein solches Formular insgesamt vier Arrays mit den Namen $MyFiles,
$MyFile_name, $MyFiles_size und $MyFiles_type, deren Elementezahl die
Anzahl der gleichnamigen Formularfelder ist. Die Kopie der beispielsweise zweiten Datei aus dem Temporärverzeichnis des Servers in einen
Ihnen genehmen Bereich geschieht dann mittels:
copy($MyFiles[1],'\MeinVerzeichnis\'.$MyFiles_name[1]);
Der Button B3 liefert unter Verwendung des MSIE den gesamten Inhalt der
HTML-Datei zwischen den <Button>- und </Button>-Tags, und zwar immer!
176
PHP 4
INTERAKTIVE PROGRAMMIERUNG
Also nicht nur, wenn der Button auch geklickt wird. Bei Aufruf mit Netscape bleibt die Variable B3 leer.
Der Button B4 liefert unter beiden Browsern die X- und Y-Koordinate des
Mausklicks innerhalb des Buttons. Hier verbergen sich hervorragende
Möglichkeiten der interaktiven grafischen Gestaltung.
Beim Netscape 4.73 wird der Parameter disabled nicht nur auf der Formularseite ignoriert, sondern auch beim Versand der Formulardaten. Während der MSIE aus dem mit disable abgeschalteten Textfeld keinen Wert
übermittelt, empfängt PHP bei Verwendung des Netscape den voreingestellten Wert. Es bleibt wieder an Ihnen hängen, solche Bugs oder Unterlassungen abzufangen.
Hier noch die Ausgabe des Scriptes im Browser. Ich empfehle, sich zum
besseren Verständnis alle beteiligten Dateien in die Entwicklungsumgebung zu holen und experimentell damit zu arbeiten.
Das Verständnis der Zusammenarbeit zwischen HTML-Formulartags, der
Parameter und deren halbautomatische Umsetzung in PHP-Variablen ist
elementar erforderlich zum Umgang mit der Entwicklungsumgebung und
bildet die größte Fehlerquelle bei Anfängern.
Scheuen Sie sich nicht, mit dem oben angeführten Formular und Script zu
spielen, das Original finden Sie auf der Buch-CD. Und testen Sie das Script
mit beiden Browsern.
Abb. 4.2:
Die Auswertung
des Formulars
PHP 4
177
KAPITEL 4
Wenn Sie die Ansicht des HTML-Formulars mit der Browseransicht der
späteren Datenausgabe vergleichen, wird Ihnen auffallen, daß die Daten
des <textarea> ...</textarea>-Elementes im Browser um die Leerzeichen
verkürzt zurückgegeben werden. Wenn Sie sich den Quelltext im Browser
ansehen, wird deutlich, warum: Das Formularelement sendete Leerzeichen (ASCII 32), und ein HTML-Interpreter, der Browser, stellt dieses Zeichen ohne besondere Maßnahmen maximal immer einmal dar, nie mehrere Leerzeichen nebeneinander. Ein Browser erwartet für ein
Leerzeichen die Zeichenkette »&nbsp;«. Das nächste Beispiel geht auf
diese Datenformate zwischen PHP und Browser näher ein.
4.1.1
Datenformate
Ein HTML-Formular sendet die Formulardaten im Format »application/xwww-form-urlencoded«. Das heißt, alle Leerzeichen und viele Sonderzeichen werden normal nicht als solche zurückgesendet, sondern sind in
einer solchen Form kodiert: »Danke+f%FCr+die+Hilfe%21«.
Abb. 4.3:
Testformular
178
PHP 4