<?php /** * filterInputDefaults * erweitert filter_input_array um 'default' * Siehe dazu auch die Doku zu filter_input_array * http://ch2.php.net/manual/de/function.filter-input-array.php * @param int $type Einer von INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION oder INPUT_REQUEST * @param array $args * @return array */ function filterInputDefaults($type, $whitelist ){ $myInputs = filter_input_array($type, $whitelist); array_walk($myInputs, create_function('&$item, $key, $args', '$item = (is_null($item) && is_array($arg=$args[$key])) ? $arg["default"] : $item;'), $whitelist); return $myInputs; } ?>
Und hier ein Anwendungsbeispiel
{ <?php include_once('filterInputDefaults.php'); ///test2.php?email_1=test@test.info&email_2=blah&int_1=14 $whitelist= array( 'email_1' => FILTER_VALIDATE_EMAIL, 'email_2' => FILTER_VALIDATE_EMAIL, 'text_1' => array( 'filter' => FILTER_SANITIZE_STRING, 'default' => 'Standart-Text'), 'int_1' => array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_NULL_ON_FAILURE, 'options' => array('min_range' => 1, 'max_range' => 10)), 'int_2' => array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_NULL_ON_FAILURE, 'default' => 15) ); $myInputs = filterInputDefaults(INPUT_GET, $whitelist); var_dump($myInputs); ?>
Die Ausgabe mit test.php?email_1=test@test.info&email_2=blah&int_1=14
array(5) { ["email_1"]=> string(14) "test@test.info" ["email_2"]=> bool(false) ["text_1"]=> string(13) "Standart-Text" ["int_1"]=> NULL ["int_2"]=> int(15) }
Die obere Variante ist aus meiner Sicht vorzuziehen
Eine einfache möglichkeit, nur $_POST- Einträge (oder alternativ dazu $_GET) in Variablen übernehmen die man im Vorraus definiert hat.
<?php // Diese Zeile simuliert die Post-Übergabe eines Formulars $_POST = array( 'a'=>'Value a ist ein nicht definertes Feld', 'b'=>'Value b ist definiert und wird ausgegeben', 'c'=>'Value c ist ebenfalls definiert'); //Liste aller erlaubten postitems $whitelist = array('c', 'b'); //Variablen zu allen erlaubten postitems erstellen extract(array_intersect_key($_POST, array_flip($whitelist))); //Testausgabe um dieses Script zu testen echo "\$a: {$a}<br />\n"; echo "\$b: {$b}<br />\n"; echo "\$c: {$c}<br />\n"; ?>
Ausgabe:
$a: $b: Value b ist definiert und wird ausgegeben $c: Value c ist ebenfalls definiert
Natürlich beinhaltet das noch keine Inhaltliche Prüfung der Variablen
Falls man mit Standartwerten arbeiten will, wenn ein Paramter der Whiltelist nicht übergeben wurde, kann ma es auch etwa so lösen
<?php // Diese Zeile simuliert die Post-Übergabe eines Formulars $_POST = array( 'a'=>'Value a ist ein nicht definertes Feld', 'b'=>'Value b ist definiert und wird ausgegeben', 'c'=>'Value c ist ebenfalls definiert'); //Liste aller erlaubten postitems $whitelist = array( 'b' => '20', 'c' => NULL, 'd' => 'DeaultText'); //alle items aus $_POST auslesen die in der whitelist definiert sind $posts = array_intersect_key($_POST, $whitelist); //alle items aus der whitelist anhängen, die nicht aus $_POST übernommen werden $posts = $posts + array_diff_key($whitelist, $posts); //Variablen zu allen erlaubten postitems erstellen extract($posts); //Testausgabe um dieses Script zu testen echo "\$a: {$a}<br />\n"; echo "\$b: {$b}<br />\n"; echo "\$c: {$c}<br />\n"; echo "\$d: {$d}<br />\n"; ?>
Ausgabe:
$a: $b: Value b ist definiert und wird ausgegeben $c: Value c ist ebenfalls definiert $d: DeaultText