User Tools

Site Tools


php:kompost:post2var

[PHP] $_POST in Variablen wandeln mit einer Whitelist



mit filter_input_array()

filterInputDefaults.php
<?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

test.php
{
<?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)
}

files

Alte Variante

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

CatPhp | CatTutorial

php/kompost/post2var.txt · Last modified: 11.12.2013 11:51:08 (external edit)