8800 sujets

Développement web côté serveur, CMS

Re bonjour,

Fort d'une réponse rapide et claire je pense avoir pris goût à poster sur ce forum =)

Enfin plus serieusement le problème qui m'amène cette fois à poster est malheureusement encore une fois pas très glorieux puisqu'il s'agit de la fonction array_walk qui me fait des misère...

Dans un premier temps la description du problème :
Voilà, j'aimerais automatiser sur mes pages l'utilisation des fonction mysql_escape_string et htmlspecialchars sur certaines données d'un formulaire d'inscription.
Le soucis est qu'un foreach qui passe par un référencement tel que :
<?php 
foreach($_POST as &$value)
			  {
				$value = htmlspecialchars($value);
				$value = mysql_escape_string($value);
			  }
			  unset($value);
?>

m'est interdit puisque le serveur sur lequel sera hébergé mon site en est à une version antérieure à la 5...

J'ai donc testé la fonction array_walk qui parait correspondre à mes attentes, mais impossible de comprendre correctement la doc php =/
Je me suis finalement arreté à ce code qui ne marche pas bien sûr ~~ en espérant que quelqu'un qui aurait déjà u recours à cette fonction m'en dise plus sur la syntaxe à utiliser.

<?php
	$frm = array("d" => "<table>", "a" => " ' \" ");

	function antihack($value)
	{
		$value = htmlspecialchars($value);
		$value = mysql_escape_string($value);
		
		return $value;
	}

	$frm2 = array();
	$frm2 = array_walk($frm, 'antihack');
?>
Bon hé bien je suis vraiment désolé pour le dérangement mais j'ai fini par trouver seul u_u"""


Voilà la solution pour ceux que ça interessera :


<?php 
$frm = array("d" => "<table>", "a" => " ' \" ");

	function antihack($value)
	{
		$value = htmlspecialchars($value);
		$value = mysql_escape_string($value);
			
		return $value;
	}

	$frm2 = array_map("antihack" , $frm);
	
	print_r($frm2);
?>


Voilà, j'ai fini par utiliser la fonction array_map en tombant par hasard dessus et en remarquant.. bah qu'elle faisait pareil que la fonction array_walk au niveau d'utilisation que j'en faisais (c'est à dire sans le référencement).

Si quelqu'un pouvais prendre la peine de nous en dire plus sur la fonction array_walk, je pense que cela pourrait être enrichissant !

Merci !
Salut,

La différence principale entre array_map et ~walk, c'est que la première retourne un nouveau tableau, tandis que la 2ème se contente de dire si tout s'est bien passé.

Je dirais qu'il faut utiliser map :
- si on ne veut pas toucher au tableau d'origine
- mais qu'on veut récupérer un tableau modifié
et walk :
- si on veut appliquer un traitement aux éléments sans attendre de retour
- si on veut modifier le tableau d'origine (il faudra que la fonction de callback prenne un argument par référence)

Un petit exemple minimaliste : annuler les magic quotes (que les gpc et que sur $_POST, pour l'exemple) :
if (get_magic_quotes_gpc() == 1)
{
    array_walk_recursive($_POST, create_function('&$item', '$item = stripslashes($item);'));
}

bon là j'ai utilisé la fonction récursive mais c'est du pareil au même. C'est bien le tableau $_POST qui est modifié (voir la référence (&) devant l'argument de la fonction).

En bonus : create_function est bien pratique, notamment pour utiliser une fonction native du langage dans un callback (ce n'est pas autorisé si je me souviens bien). A réserver toutefois pour de petites fonctions, quand l'usage est très local.

Cela suffit-il à éclairer ta lanterne ?

Bonne continuation
J.
Très très enrichissante comme explication !

Merci beaucoup =)

Modifié par Shin (20 Feb 2009 - 10:17)