if, else, switch Kontrollen
Durch if, and, or, elseif und else oder durch switch prüfe ich variable Werte. Je nach erfüllter oder verpasster Bedingung handle ich dann unterschiedlich. Als Beispiel wird die Entgegennahme und der Vergleich von übermittelten Variablen aus einer anderen Seite behandelt.
Variable übernehmen
Die Methode durch die Variablen übernommen werden, hängt von der Art ihrer Übermittlung ab. Im Formular sollte die Metode 'POST' (könnte aber auch 'GET') gewählt werden, via Links, werden die Variablen immer per 'GET' im Querrystring (an die Adresse angehängt) übermittelt.
Die Variablen müssen (entsprechend der Einstellung in PHP ini) explizit abgeholt werden.
Sie sind in diesen Arrays enthalten: $_POST[name] oder $_GET[name] und
falls beide Methoden erwartet werden $_REQUEST[] (in diesem Beispiel ist dem so).
<?php
if(isset($_REQUEST["usr"])){ // Benutzereingabe, ev. von variable_seite.php
$usr = $_REQUEST["usr"]; // abholen für alle folgenden Scripts
$usr = htmlspecialchars($usr); // Usereingabe entschärfen
$usr = strtolower($usr); // in Kleinbuchstaben umwandeln: JA oder Ja in ja
} else { // falls diese Seite via Subnavigation geöffnet wurde
$usr = "leer";
}
?>
Savety first:
Die Entschärfung von Benutzereingaben sollte möglichst nahe dem Empfang erfolgen.
Auch wenn ich nicht vor habe, die Eingabe auszugeben, unterziehe ich die Variable hier einer Entschärfung durch htmlspecialchars(). So müsste ich weiter unten nicht mehr daran denken, dem Thema Sicherheit wurde genüge getan und ich kann entspannt weiter coden.
wenn - wenn - wenn
if()
Diese drei if-Abfragen prüfen, ob die eine oder die andere Bedingung erfüllt wurde -
und drittens, ob die eine und die andere Bedingung nicht erfüllt wurde.
<?php
if ($usr == "ja") { echo "Sie haben sich dafür entschieden."; }
if ($usr == "nein") { echo "Sie haben sich dagegen entschieden."; }
if ($usr != "ja" and $usr != "nein") { echo "Sie haben weder 'ja' noch 'nein' gestimmt."; }
?>
Beachte: die verneinenden Vergleiche und der and Operator in der 3. if-Abfrage.
wenn - sonst wenn - sonst
elseif() und else
Die if-elseif-else-Abfrage fragt kein drittes Mal, sondern tut einfach etwas,
es gibt die empfangene Eingabe aus.
Spätestens hier, vor der Ausgabe, müsste die
Usereingabe entschärft werden; im Beispiel mit htmlspecialchars().
(Die wurde aber schon beim Empfang weiter oben entschärft.)
<?php
if ($usr == "ja") {
echo "Sie haben ja gesagt.<br />";
echo "(Das haben Sie gut gemacht!)";
} elseif ($usr == "nein") {
echo "Sie haben nein gesagt.";
} else {
echo "Sie haben ".htmlspecialchars($usr,ENT_QUOTES)." gesagt.";
}
?>
Alternativer if Syntax
endif
Statt zwischen geschweifte Klammern, kommt der Anweisungsblock zwischen einen Doppelpunkt und einem, das Ende der if Abfrage kennzeichnenden, endif.
<?php if ($usr == "ja") : // Doppelpunkt echo "Sie haben ja gesagt."; endif; // endif ?>
Mir gefällt der Doppelpunkt nicht so gut, er ist mir zuwenig markant, darum möchte ich nicht auf geschweiften Klammern verzichten.
Operatoren
Vergleichende Operatoren
In einer Abfrage werden immer Zustände, Variablen mit Konstanten, Zahlen oder Rückgabewerten mittels Operatoren verglichen. Ist gleich, ist dabei nur eine der möglichen Fragen.
if ($a == $c) {...} // gleich
if ($a != $c) {...} // nicht gleich
if ($a === $c) {...} // identisch (auch Typ)
if ($a !== $c) {...} // nicht identisch (mit Typ)
if ($a <> $c) {...} // ungleich
if ($a < $c) {...} // kleiner als
if ($a <= $c) {...} // kleiner als oder gleich
if ($a > $c) {...} // grösser als
if ($a >= $c) {...} // grösser als oder gleich
Rückgabewert ist boolean
Nur wenn der Rückgabewert true oder 1 ist, wird der Befehl in der geschweiften Klammer ausgeführt.
Operatoren geben boolean Werte an die Kontrollstruktur zurück, also 'true' (wahr) oder 'false' (falsch).
Als interger (als Zahl) entsprechen 1 dem true und 0 dem false.
Als string (als Zeichenkette) entsprechen "1" dem true und "" (leer) dem false.
true und false sind nicht casesensitive, also auch so sind TRUE und FALSE richtig geschrieben.
var_dump((bool) ""); // bool(false) var_dump((bool) "text"); // bool(true) var_dump((bool) 0); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -1); // bool(true) var_dump((bool) 1.1); // bool(true) var_dump((bool) FALSE); // bool(false) var_dump((bool) TRUE); // bool(true) var_dump((bool) NULL); // bool(false) var_dump((bool) array(11)); // bool(true) var_dump((bool) array()); // bool(false)
Gleich oder identisch
== oder ===
Falls ein Rückgabewert einer Funktion oder Operation 0 sein dürfte,
muss der Rückgabewert auf Identität geprüft werden.
Der Test false == 0 gibt nämlich TRUE zurück, da er nicht genau
genug unterscheidet.
Der Test false === 0 gibt FALSE zurück, was stimmt, denn 0 ist
eben nicht identisch mit false:
$intGesunde = 5;
$intKranke = 5;
$intAnwesende = $intGesunde - $intKranke;
if ($intAnwesende == false) {
echo "Ist die Berechnung schief gelaufen?";
}
if ($intAnwesende === false) {
echo "Die Berechnung ist schief gelaufen!";
} else {
echo "Es hatte $intAnwesende Anwesende.";
}
Es hatte 0 Anwesende.
Konstanten im Vergleich
Wird eine Variable mit einer Konstanten verglichen, sollte die Konstante links
des Vergleichsoperators stehen, es sollte also die Konstante mit der Variablen verglichen werden.
(Das mache ich selten so, aber es wäre Fehlerresistenter, weil Fehlermeldungen generiert werden.)
Z.B.: if (false == $fp) {...} // $fp = false generierte keine Fehlermeldung
Z.B.: if (7 === $intZwerge) {...} // $intZwerge = 7 generierte keine Fehlermeldung
Logische Operatoren
and, &&, or, ||
Durch logische Operatoren werden Bedingungen differenzierter geprüft. Zusätzliche oder alternative Bedingungen werden in der selben Klammer gestellt:
if ($a == 1 and $b == 1) // und will beide Bedingungen erfüllt haben if ($a == 1 or $a == 2) // oder will mindestens eine von beiden erfüllt haben if ($a == 1 xor $a == 2) // entweder oder will maximal eine von beiden erfüllt haben
Statt 'and' gilt auch &&, statt 'or' gilt auch ||.
Bei der Verkettung von mehreren Bedingungen hat sich && besser bewährt!
Bei komplexen Bedingungen mit Rechenoperationen empfiehlt sich ein Klammerpaar
zur Abgrenzung des logischen Operators zu den Bedingungen:
if ((komplexe Bedingung) && (komplexe Bedingung)) // beide Bedingungen in Klammern
Ternärer Operator
? :
Der ternäre Operator erlaubt eine sehr knappe Abfrage und wird darum innerhalb von Ausgaben verwendet:
<?php
$Kontostand = -12360;
echo "Kontostand 31.12.2012: <span style='color:"
.($Kontostand < 0 ? "red" : "black")
.";'> $Kontostand</span> CHF";
?>
switch - die Fallstudie
switch(), case, break
Mehrere if-Aneinanderrehungen können umgangen werden durch den Vergleich einer Variablen mit mehreren Fällen, der bei Übereinstimmung abgebrochen wird.
Zum Beispiel:
if ($usr == nein) {machetwas;}
elseif ($usr == jein) {machetwas;}
elseif ($usr == ja) {machetwas;}
else {machetwas;}
wird zu:
<?php
switch ($usr){
case "nein":
echo "Zutritt verweigert.";
break; // Abbruch
case "jein":
echo "Bitte entscheiden sie sich.";
break; // Abbruch
case "ja":
echo "Zutritt erteilt.";
break; // Abbruch
default:
echo "Eingabe ungültig.";
}
?>
Kontrollschleifen
Siehe Schleife