array_walk_recursive
Vooral voor beginnende PHP-ers is het belangrijk om je te verdiepen in veiligheid in je scripts. Wanneer je met formulieren werkt en informatie in een database wilt stoppen moet je de invoer van de gebruiker controleren. Nu kan de $_POST array behoorlijk lang worden, en zelfs multidimensionaal zijn. Als je bijvoorbeeld een aantal checkboxen in je formulier hebt met een arraynaam 'hobbies', dan staat in $_POST['hobbies'] ook weer een array. Sinds PHP 5 bestaat er een functie, array_walk_recursive , die een hele array kan doorlopen en op elk arrayelement dezelfde bewerking kan doen. Dit werkt ook met multidimensionale arrays (vandaar de naam recursive ) array_walk_recursive krijgt twee argumenten mee: de array, en een string met daarin de naam van de functie die op de elementen losgelaten wordt. In die functie kun je al je standaardbeveiliging zetten. Zie verder het voorbeeld. Ik weet dat veel hosts nog geen PHP 5 draaien, maar hopelijk duurt dat niet lang meer. En anders installeer je gewoon WAMP, dan kun je lokaal alvast zien hoe het werkt. Happy PHP-ing! Jan Koehoorn
[code]
<?php
// alle errors aan
ini_set ('display_errors', 1);
error_reporting (E_ALL);
// deze is nodig omdat ik mysql_real_escape_string gebruik
require '../../db_config.php';
// de functie die op elk element van de array losgelaten wordt
// $value wordt niet 'by value', maar 'by reference' meegegeven,
// zodat de waarde in het arrayelement ook werkelijk aangepast wordt
function safe (&$value, $key) {
$value = trim ($value);
$value = strtoupper ($value); // deze is alleen maar om te laten zien dat er echt iets gebeurt
$value = mysql_real_escape_string ($value);
}
// array_walk_recursive gaat ALLE elementen van een array af,
// OOK als het een multidimensionale array is
// het eerste argument is de array, het tweede argument is de naam
// van de functie die op de elementen van de array inwerkt
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
array_walk_recursive ($_POST, 'safe');
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Array Walk Recursive</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
#container {
margin: 16px auto;
padding: 8px;
width: 500px;
border-right: 1px dotted #abc;
border-left: 1px dotted #abc;
}
form {
background: #f9f9ff;
padding: 8px;
}
h1 {
font: bold 1em georgia;
color: #abc;
margin: 0px 0px 16px 0px;
padding: 4px;
border-bottom: 1px dotted #abc;
}
p, label, input, textarea, pre, select, option {
font: 11px verdana;
padding: 2px;
}
pre {
color: #999;
}
label {
cursor: pointer;
}
label.naast {
float: left;
width: 100px;
text-align: right;
}
.lijnuit {
margin-left: 104px;
}
</style>
</head>
<body>
<div id="container">
<h1>Testformulier</h1>
<form method="post" action="#">
<p>
<label for="naam" class="naast">naam:</label>
<input id="naam" name="naam" type="text">
</p>
<p>
<label for="adres" class="naast">adres:</label>
<input id="adres" name="adres" type="text">
</p>
<p>
<label for="postcode" class="naast">postcode:</label>
<input id="postcode" name="postcode" type="text">
</p>
<p>
<label for="woonplaats" class="naast">woonplaats:</label>
<input id="woonplaats" name="woonplaats" type="text">
</p>
<p>
<input id="appel" name="fruit[]" type="checkbox" value="appel" class="lijnuit">
<label for="appel">appel</label>
</p>
<p>
<input id="peer" name="fruit[]" type="checkbox" value="peer" class="lijnuit">
<label for="peer">peer</label>
</p>
<p>
<input id="banaan" name="fruit[]" type="checkbox" value="banaan" class="lijnuit">
<label for="banaan">banaan</label>
</p>
<p>
<input id="perzik" name="fruit[]" type="checkbox" value="perzik" class="lijnuit">
<label for="perzik">perzik</label>
</p>
<p>
<label for="maand" class="naast">maand:</label>
<select id="maand" name="maand">
<option value="01">januari</option>
<option value="02">februari</option>
<option value="03">maart</option>
<option value="04">april</option>
<option value="05">mei</option>
<option value="06">juni</option>
<option value="07">juli</option>
<option value="08">augustus</option>
<option value="09">september</option>
<option value="10">oktober</option>
<option value="11">november</option>
<option value="12">december</option>
</select>
</p>
<p>
<label for="hobbies" class="naast">hobbies:</label>
<select id="hobbies" name="hobbies[]" multiple>
<option value="voetballen">voetballen</option>
<option value="tennissen">tennissen</option>
<option value="gamen">gamen</option>
<option value="rock & roll">rock & roll</option>
<option value="'t nachtleven">'t nachtleven</option>
</select>
</p>
<p>
<input id="rood" name="kleur" type="radio" value="rood" checked="checked" class="lijnuit">
<label for="rood">rood</label>
</p>
<p>
<input id="groen" name="kleur" type="radio" value="groen" class="lijnuit">
<label for="groen">groen</label>
</p>
<p>
<input id="blauw" name="kleur" type="radio" value="blauw" class="lijnuit">
<label for="blauw">blauw</label>
</p>
<p>
<label for="opmerkingen" class="naast">opmerkingen:</label>
<textarea id="opmerkingen" name="opmerkingen">
Single quote: '
Double quote: "
Ampersand: &
</textarea>
</p>
<p>
<input type="submit" value="verzenden" class="lijnuit">
</p>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo '<div id="values">';
echo '<h1>Verzonden waarden</h1>';
echo '<pre>';
print_r ($_POST);
echo '</pre>';
echo '</div>';
}
?>
</div>
</body>
</html>
[/code]
Reacties
0