<?php
/**
* Stellt fest, ob alle benötigten Werte im POST-/GET-/COOKIE- bzw. REQUEST-Feld
* gesetzt sind
*
* Hintergrund: Es ist für den Client möglich, nur bestimmte POST-Felder zurück
* an den Server zu schicken. Wenn wir das ganz zu Beginn der Auswertung einmal
* zentral prüfen, können wir danach davon ausgehen, dass alle erwarteten Felder
* gesetzt sind. Das spart ewige isset()-Aufrufe.
*
* Diese Funktion sollte zentral in ein Include ausgelagert werden.
*
* @param array $needles Feld von Feldnamen, die gesetzt sein müssen
* @param string $where Nachsehen in GET, POST, COOKIE oder REQUEST
* (Standard: POST)
* @return array Feld mit Fehlermeldungen
*/
function istGesetzt(array $needles, $where = 'POST')
{
$where = strtoupper($where);
$errors = array();
$a = null;
switch ($where) {
case 'GET' : $a = &$_GET; break;
case 'POST' : $a = &$_POST; break;
case 'COOKIE' : $a = &$_COOKIE; break;
case 'REQUEST': $a = &$_REQUEST; break;
default:
throw new IllegalArgumentException(
'$where needs to be "GET", "POST", "COOKIE" or "REQUEST"');
break;
}
foreach ($needles as $needle) {
$a[$needle] = trim($a[$needle]);
if (!isset($a[$needle]) || $a[$needle] === '') {
$errors[] = 'Feld "' . $needle . '" nicht gesetzt';
}
}
return $errors;
}
/**
* Sichert einen String vor XSS-Attacken
*
* Es ist sinnvoll, diese Funktion auszulagern, um die Ausgabe schnell von UTF-8
* auf ISO-8859-1 oder so umstellen zu können (erfordern unterschiedliche Escape-
* Funktionen).
*
* Diese Funktion sollte zentral in ein Include ausgelagert werden.
*
* @param string $string
* @return string
*/
function escape($string)
{
return htmlspecialchars($string);
}
function actionIndex(array &$vars)
{
// Keine Template-Variablen müssen verändert werden
}
function actionRechne(array &$vars)
{
// Prüfen, ob alle Werte gesetzt
$vars['errors'] = istGesetzt(array('kmh'));
// Falls ja, prüfen, ob alle Werte sinnvollen Inhalt besitzen
if (empty($vars['errors'])) {
$_POST['kmh'] = (float) $_POST['kmh'];
if ($_POST['kmh'] <= 0) {
$vars['errors'][] = 'km/h muss größer als 0 sein';
}
}
// Falls ja, weitere Werte zur Ausgabe errechnen
if (empty($vars['errors'])) {
$vars['reaktionsweg'] = ($_POST['kmh'] / 10) * 3;
$vars['bremsweg'] = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10);
$vars['gbremsweg'] = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10 / 2);
$vars['anhalteweg'] = $vars['reaktionsweg'] + $vars['bremsweg'];
$vars['ganhalteweg'] = $vars['reaktionsweg'] + $vars['gbremsweg'];
}
}
function actionReset(array &$vars)
{
// Keine Template-Variablen müssen verändert werden
}
function actionPotenzrechner(array &$vars)
{
// Prüfen, ob alle Werte gesetzt
$vars['errors'] = istGesetzt(array('base', 'exponent'));
// Falls ja, prüfen, ob alle Werte sinnvollen Inhalt besitzen
if (empty($vars['errors'])) {
$_POST['base'] = (float) $_POST['base'];
$_POST['exponent'] = (int) $_POST['exponent'];
}
// Falls ja, weitere Werte zur Ausgabe errechnen
if (empty($vars['errors'])) {
$vars['result'] = bcpow($_POST['base'], $_POST['exponent']);
}
}
/*
* Dieser Teil ist beliebig wiederverwendbar. Hier wird die aktuell nachgefragte
* Action ermittelt und ausgeführt und die Template-Variablen werden im globalen
* Namensraum bekanntgemacht
*/
$_POST['action'] = (isset($_POST['action']))
? strtolower(trim($_POST['action']))
: 'index';
$tplVars = array();
$tplVars['action'] = $_POST['action'];
$actionFunction = 'action' . ucfirst($_POST['action']);
if (!function_exists($actionFunction)) {
throw new BadFunctionCallException(
'Action "' . $_POST['action'] . '" does not exist');
} else {
$actionFunction($tplVars);
}
unset($actionFunction);
extract($tplVars);
?>
<?php if ($action === 'reset'): ?>
<p>Formular zurückgesetzt.</p>
<?php endif; ?>
<?php if (!empty($errors)): ?>
<h2>Fehler!</h2>
<?php foreach ($errors as $error): ?>
<p>Fehler: <?php echo escape($error); ?></p>
<?php endforeach; ?>
<hr />
<?php endif; ?>
<h1>Fahrschulrechner</h1>
<form action="" method="post">
<p>Ich fahre
<input type="text" name="kmh" size="4"
value="<?php if(isset($_POST['kmh'])) echo escape($_POST['kmh']); ?>"> km/h.
<input type="hidden" name="action" value="rechne">
<input type="submit" value="Berechnen">
</p>
</form>
<?php if ($action === 'rechne' && empty($errors)): ?>
<p>Reaktionsweg: <?php echo escape($reaktionsweg); ?> m</p>
<p>Bremsweg: <?php echo escape($bremsweg); ?> m</p>
<p>Bremsweg bei Gefahr: <?php echo escape($gbremsweg); ?> m</p>
<p>Anhalteweg: <?php echo escape($anhalteweg); ?> m</p>
<p>Anhalteweg bei Gefahr: <?php echo escape($ganhalteweg); ?> m</p>
<form action="" method="post">
<input type="hidden" name="action" value="reset">
<input type="submit" name="reset" value="Löschen">
</form>
<?php endif; ?>
<hr />
<h2>Irgendwas völlig Anderes:</h2>
<p>Potenzrechner:</p>
<form method="post" action="">
<p>Basis: <input type="text" name="base"
value="<?php if(isset($_POST['base'])) echo escape($_POST['base']); ?>" /></p>
<p>Exponent: <input type="text" name="exponent"
value="<?php if(isset($_POST['exponent'])) echo escape($_POST['exponent']); ?>" /></p>
<p>
<input type="hidden" name="action" value="potenzrechner" />
<input type="submit" value="Rechnen" />
</p>
</form>
<?php if ($action === 'potenzrechner' && empty($errors)): ?>
<p>Ergebnis: <?php echo escape($_POST['base']) . '^' . escape($_POST['exponent']); ?>
= <?php echo escape($result); ?></p>
<?php endif; ?>
<hr />
<h2>Illegale Action aufrufen</h2>
<form method="post" action="">
<p><input type="hidden" name="action" value="bogus" />
<input type="submit" value="Test" />
</p>
</form>
<hr />
<h2>Ausgelöste Action</h2>
<p><?php echo escape($action); ?></p>