PHP : usage de variables variable
Je ne vais pas me lancer dans l'explication de ce que sont les variables
variable, appelées aussi tout simplement variables dynamiques.
Je vous renvoie directement à la documentation PHP.net.
qui est explicite sur ce sujet !
Le but de cet article est de parler d'un usage intéressant des variables variable, celui dans le contexte des tableaux superglobaux PHP.
Admettons que nous utilisons un formulaire dans une page web, que nous avons l'intelligence d'envoyer le tout par requête POST.
Il faut assurément récupèrer les données postées ; celles-ci sont donc accessibles par le tableau superglobal $_POST.
Au lieu de chercher à déclarer des variables dans lesquelles récupérer
les valeurs postées, pourquoi ne pas le faire dynamiquement !?
Donc au lieu de faire :
<?php
$user = $_POST["user"];
$passwd = $_POST["passwd"];
$quantity = $_POST["quantity"];
?>
Puisque le tableau superglobal POST est justement ...
un tableau, il est donc possible de le parcourir avec
la fameuse boucle fonction nommée foreach().
Ce qui nous donne :
<?php
foreach($_POST as $key => $value) {
$$key = $value;
}
unset($key, $value);
?>
Le résultat, pas forcèment évident, mais qu'il faut absolument comprendre
est que la boucle nous a bien créer nos variables variable, à savoir :
$user, $passwd, $quantity selon notre exemple !
Mais aussi, et forcèment, toutes autres variables qu'une personne
malintentionnée chercherait à nous faire admettre.
C'est pourquoi, il faut absolument veiller à se protéger, et des variables reçues et de leur valeurs !
On pourra ainsi utiliser l'exemple d'une telle fonction récursive, telle que la suivante :
<?php
if(get_magic_quotes_gpc() == 1) {
# Définition de la fonction récursive.
function remove_magic_quotes($array) {
foreach($array as $key => $value) {
# Si c'est un tableau, récursion de la fonction, sinon suppression des slashes
if(is_array($value)) {
remove_magic_quotes($array[$key]);
}
elseif(is_string($value)) {
$array[$key] = stripslashes($value);
}
}
unset($key, $value);
}
# Appel de la fonction pour chaque variables.
remove_magic_quotes($_POST);
remove_magic_quotes($_GET);
remove_magic_quotes($_REQUEST);
remove_magic_quotes($_SERVER);
remove_magic_quotes($_FILES);
remove_magic_quotes($_COOKIE);
}
?>
Pour se créer la suivante :
<?php
function securise_variables($array) {
if(!empty($array) && is_array($array)) {
foreach($array as $key => $value) {
# Si c'est un tableau, récursion de la fonction, sinon suppression de certains tags
if(is_array($value)) {
securise_variables($array[$key]);
}
elseif(is_string($value)) { // on peut très bien préférer l'usage de la fonction htmlentities(), par exemple
$array[$key] = strip_tags($value);
}
}
unset($key, $value);
}
}
securise_variables($_POST);
?>
On pourrait directement l'utiliser sur le tableau superglobal POST, mais on préferera l'utiliser ainsi :
<?php
if(!empty($_POST)) {
securise_variables($_POST);
foreach($_POST as $key => $value) {
$$key = $value;
}
unset($key,$value);
}
unset($_POST);
?>
Ensuite, il est très important de typer nos variables dynamiques selon le type qu'elles doivent absolument avoir !
<?php
// puisque $quantity doit être un numeric et non un entier, puisque c'est une chaîne numérique
if(!is_numeric($quantity)) unset($quantity);
// puisque $user doit $etre de type string
if(!is_string($user)) unset($user);
?>
Et, oui, si la donnée n'est pas du type, telle qu'elle devrait être définie
et que je dois m'attendre à recevoir, alors je la détruis.
Mais cela est une autre histoire, à laquelle il faut ABSOLUMENT veiller !
Bien sûr, cet exemple n'est qu'exhaustif ... libre à vous de l'améliorer !
Et de l'utiliser sur les autres tableaux superglobeaux que PHP nous offre ;-)
<<| Page : PHP : code : variables_variable : |