Web-Entwicklung mit PHP
Vordefinierte assoziative Arrays
$GLOBALSalle globalen Variablen$_COOKIEalle Cookies für diesen Server$_GETper GET übermittelten Formulardaten$_POSTper POST übermittelten Formulardaten$_FILESInfos über mit POST hochgeladene Dateien$_ENVUmgebungsvariablen des Systems$_SERVERUmgebungsvariablen des Web-Server$_REQUESTDaten vom Client ($_GET+$_POST)
Zugriff auf Formulardaten
Zugriff auf Formulardaten über Arrays
$_GETfür per GET übertragene Parameter$_POSTfür per POST übertragene Parameter$_REQUESTfür beide Arten- Query-String ist bereits von PHP dekodiert worden
- Name des Formularelements dient als Index, z. B.
$_POST["vorname"] - Daten sind immer Strings, müssen nach Bedarf umgewandelt werden
Beispiel: Formularelemente
<!DOCTYPE html>
<html>
<head><title>Formular</title></head>
<body>
<form action="#" method="POST">
<input type="text" name="vorname"/><input type="submit" name="Absenden"/>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {
$params = $_GET;
}
else if ($_SERVER["REQUEST_METHOD"] == "POST") {
$params = $_POST;
}
if (isset( $params["vorname"])) {
echo "Hallo ", $params["vorname"];
}
?>
</body></html>
<!DOCTYPE html>
<html>
<head><title>Formular</title></head>
<body>
<form action="#" method="POST">
<input type="text" name="vorname"/><input type="submit" name="Absenden"/>
</form>
<?php
echo "Hallo ", $_REQUEST["vorname"];
?>
</body></html>
Mehrfachauswahl
Manche Formularfelder erlauben eine Mehrfachauswahl
Im $_POST-, $_GET-Array steht dann aber nur der letzte Wert
Ausweg: Feldnamen mit [] enden lassen
- Browser und Web-Server ignorieren die Klammer
- PHP weiß, dass eine Mehrfachauswahl möglich ist
- Daten werden als Array in
$_REQUESTbzw.$_POSToder$_GETgespeichert
Beispiel: Einfachauswahl
<!DOCTYPE html>
<html><head><title>Formular</title></head><body>
<form action="#" method="POST">
<input type="checkbox" name="obst" value="orange"> Orange
<input type="checkbox" name="obst" value="apfel"> Apfel
<input type="checkbox" name="obst" value="birne"> Birne
<input type="submit" name="Absenden"/>
</form>
<?php
$obst = $_POST["obst"];
print_r($obst); // -> birne
?>
</body></html>
Beispiel: Mehrfachauswahl
<!DOCTYPE html>
<html><head><title>Formular</title></head><body>
<form action="#" method="POST">
<input type="checkbox" name="obst[]" value="orange"> Orange
<input type="checkbox" name="obst[]" value="apfel"> Apfel
<input type="checkbox" name="obst[]" value="birne"> Birne
<input type="submit" name="Absenden"/>
</form>
<?php
$obst = $_POST["obst"];
print_r($obst);
// -> Array ( [0] => orange [1] => apfel [2] => birne )
?>
</body></html>
Formulare und Sicherheit
Man kann sich nicht sicher sein, welche Daten übermittelt werden
- deshalb nie die übermittelten Parameter auswerten,
- sondern immer die erwarteten Parameter
// Pfui!
foreach ($_POST as $key => $value) {
$datensatz[$key] = $value;
}
// Besser
if (isset ($_POST["feld1"]) && is_numeric($_POST["feld1"])) {
$datensatz["feld1"] = $_POST["feld1"];
}
Überprüfung auf unerwünschte Zeichen
Daten vom Browser sollten überprüft werden
- Unerwünschte Zeichen ausfiltern
- Wiederholung client-seitiger Überprüfungen
- Am einfachsten über Reguläre Ausdrücke
bool preg_match ($pattern, $subject);
$_SERVER-Array
Enthält Informationen zur Server- und Ablaufumgebung
- Aufgerufene URL
- Header aus dem HTTP-Request
- Informationen zum Server
- Informationen zum Client
Beispiel: $_SERVER
http://jonathan.sv.hs-mannheim.de/~t.smits/test.php?obst=orange&name=Franz
[HTTP_HOST] => jonathan.sv.hs-mannheim.de
[HTTP_USER_AGENT] => Mozilla/5.0 Safari/534.57.2
[HTTP_ACCEPT] => text/html,application/xhtml+xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => de-de
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
[SERVER_SIGNATURE] => Server at jonathan.sv.hs-mannheim.de Port 80
[SERVER_SOFTWARE] => Apache/2.2.8 (Fedora)
[SERVER_NAME] => jonathan.sv.hs-mannheim.de
[SERVER_ADDR] => 141.19.141.151
[SERVER_PORT] => 80
[REMOTE_ADDR] => 158.23.13.33
http://jonathan.sv.hs-mannheim.de/~t.smits/test.php?obst=orange&name=Franz
[DOCUMENT_ROOT] => /var/www/html
[SERVER_ADMIN] => m.plugge@hs-mannheim.de
[SCRIPT_FILENAME] => /home/t.smits/public_html/test.php
[REMOTE_PORT] => 51698
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] => obst=orange&name=Franz
[REQUEST_URI] => /~t.smits/test.php?obst=orange&name=Franz
[SCRIPT_NAME] => /~t.smits/test.php
[PHP_SELF] => /~t.smits/test.php
[REQUEST_TIME] => 1342605376
Erzeugung einer URL-Parameterliste
Regeln für GET-Parameter
- Werden mit
?an die URL angehängt - Jeder Parameter hat das Format
name=wert - Parameter werden durch
&getrennt - Sonderzeichen müssen escaped werden
Erzeugung wird erleichtert durch die Funktionhttp_build_query($parameterArray);
Beispiel: http_build_query
$query = http_build_query(
array ("obst" => "Apfel",
"name" => "Franz",
"spruch" => "Ehrlich währt am längsten"));
echo $query;
obst=Apfel&name=Franz&spruch=Ehrlich+w%C3%A4hrt+am+l%C3%A4ngsten
Zerlegen eines Query-Strings
Empfangener Query-String kann wieder zerlegt werdenparse_str($query, $output);
$query = "obst=Apfel&name=Franz" .
"&spruch=Ehrlich+w%C3%A4hrt+am+l%C3%A4ngsten";
parse_str($query, $output);
print_r($output);
Array
(
[obst] => Apfel
[name] => Franz
[spruch] => Ehrlich währt am längsten
)
Parsen einer URL
Eine empfangene URL kann wieder zerlegt werden$ergebnis = parse_url($url);
$url = "http://www.web.de/index.html?obst=Apfel&name=Franz" .
"&spruch=Ehrlich+w%C3%A4hrt+am+l%C3%A4ngsten";
$a = parse_url($url);
print_r($a);
Array
(
[scheme] => http
[host] => www.web.de
[path] => /index.html
[query] => obst=Apfel&name=Franz&spruch=Ehrlich+w%C3%A4hrt+am+l%C3%A4ngsten
)