Comment transformer ce bout de code en fonction ?

WRInaute occasionnel
Bonjour,

Je viens de me rendre compte que j'utilise x fois le même petit script dans différentes pages.
Ca alourdit vraiment le code et ça fait très amateur. Chose normale me direz-vous, puisque j'en suis un. Mais enfin... Voilà l'engin :
Code:
if(!empty($_POST['attribution_']))
{
$attribution = array_map(function ($val) 
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $_POST['attribution']);
Comme vous l'avez compris, il s'agit de filtrer un tableau de variable retourné par $_post[].

J'ai donc essayé cela (c'est la première fois que j'utilise les fonctions...) :
Code:
function filtre_tableau($variable_qui_change_selon_la_page)
{
  if(!empty($variable_qui_change_selon_la_page))
{
$variable_qui_change_selon_la_page = array_map(function ($val) 
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $variable_qui_change_selon_la_page);
}

Mais quand j'appelle la fonction comme suit : filtre_tableau($_POST['attribution']) et bien ça ne me retourne tout simplement rien.
Je me dis que dans ma fonction, je ne prends pas en compte le fait que la variable est retournée par $_POST[]. Mais alors, quelle serait la syntaxe correcte ?

Merci d'avance pour vos réponses, chers wrinautes !
 
WRInaute passionné
Tu passes ton argument à la fonction "par valeur" (défaut en php). Ca veut dire que la fonction ne travaille pas sur ta variable, mais sur une copie, et que la variable de départ est inchangée.

Pour que ça marche, il faut passer ta variable "par référence" en modifiant l'argument de la fonction :
function filtre_tableau(&$variable_qui_change_selon_la_page)
{
if(!empty($variable_qui_change_selon_la_page))
{
$variable_qui_change_selon_la_page = array_map(function ($val)
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $variable_qui_change_selon_la_page);
}
Le "&" (ampersand) avant le nom de variable indique le passage par référence.
Voir http://php.net/manual/fr/functions.arguments.php
 
WRInaute occasionnel
Salut à vous,

klp a dit:
Bonjour,

J'ai une question bête :
Pourquoi pas un include php ?

Hum... A quoi va me servir un include.php, s'il n'appelle pas une fonction à son tour ?

MikeR a dit:
Tu passes ton argument à la fonction "par valeur" (défaut en php). Ca veut dire que la fonction ne travaille pas sur ta variable, mais sur une copie, et que la variable de départ est inchangée.

Pour que ça marche, il faut passer ta variable "par référence" en modifiant l'argument de la fonction
Le "&" (ampersand) avant le nom de variable indique le passage par référence.
Voir http://php.net/manual/fr/functions.arguments.php[/quote]
Si j'a bien compris, mon code est bon et j'ai pigé le principe (à peu près du moins). C'est seulement l'absence de ce & qui l'empêche de fonctionner ? Une erreur de "syntaxe" donc ?

J'ai quand même un peu de mal avec cette explication :
Par défaut, les arguments sont passés à la fonction par valeur (aussi, changer la valeur d'un argument dans la fonction ne change pas sa valeur à l'extérieur de la fonction). Si vous voulez que vos fonctions puissent changer la valeur des arguments, vous devez passer ces arguments par référence.

Si vous voulez qu'un argument soit toujours passé par référence, vous pouvez ajouter un '&' devant l'argument dans la déclaration de la fonction :
La valeur est transmise à la fonction par une variable. Quel est donc l'intérêt de passer un argument à une fonction si c'est pour n'en point changer la valeur au final ?
Et si donc je passe une variable $_POST[] en argument pour y appliquer une fonction de filtrage, on considère donc que la valeur de ladite variable a été modifiée, puisque filtrée ?

C'est confus....
 
WRInaute discret
Alorsladaccord a dit:
Hum... A quoi va me servir un include.php, s'il n'appelle pas une fonction à son tour ?

Ma question était vraiment bête et j'avais cru comprendre que tu incluais toujours le même bout de code php alors ça ma fait penser aux includes.
 
WRInaute occasionnel
Bah, je te remercie quand même pour ta réponse klp. Et puis à ma connaissance, mieux vaut faire un require_once().


Ceci dit, le code ci-dessus ne fonctionne toujours pas, même en ajoutant &, comme l'indique MikeR.
Si quelqu'un peut le corriger et m'expliquer un peu, je devrais pouvoir me débrouiller pour les suivants...
Je rappelle qu'il s'agit donc de filtrer différentes variables $_GET[] au moyen d'une même fonction utilisateur appelant la fonction Sanitize int.

Merci d'avance
 
WRInaute occasionnel
Salut Usagi',

En fait, à partir de la fonction du premier post, à laquelle j'ai donc rajouté le & comme l'indique MikeR, je fais ensuite ainsi :

Code:
filtre_tableau($_GET['rubrique'])

Et c'est tout.
Et le script ne détecte rien.
Par exemple, j'ai une condition if isset $rubrique qui inclut une page php et bien cette page n'est pas incluse.
 
WRInaute occasionnel
Mais je ne veux pas afficher de résultat, donc je n'ai pas besoin d'echo. Je replace le bout de code :
Code:
1) LA FONCTION :

    function filtre_tableau(&$variable_qui_change_selon_la_page)
    {
      if(!empty($variable_qui_change_selon_la_page))
    {
    $variable_qui_change_selon_la_page = array_map(function ($val)
    {
    return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
    }, $variable_qui_change_selon_la_page);
    }
------------------------------------------------
2) L'UTILISATION DE LA FONCTION : 

filtre_tableau($_GET['rubrique']) ;

if isset($rubrique) {require_once....;}

Je veux récupérer la variable désormais filtrée, pour l'utiliser plus bas dans le script. Mais apparemment la variable s'évapore en chemin, puisque la condition if isset n'est pas exécutée.
 
WRInaute occasionnel
Non plus.

Bon, j'ai essayé un code plus simple.

Code:
FONCTION DE DEPART (testé avec et sans &) : 
function filtre_numerique(&$variable_qui_change_selon_la_page)
{
//$variable_qui_change_selon_la_page=$_GET['variable_qui_change_selon_la_page'];
$variable_qui_change_selon_la_page=filter_var ( $variable_qui_change_selon_la_page, FILTER_SANITIZE_NUMBER_INT);
}

Code:
APPEL DE LA FONCTION :
if(isset($_GET['rubrique']))
{
$rubrique=filtre_numerique($_GET['rubrique']);
}
Résultat nul. Plus bas dans le script, la condition if isset($rubrique) { require;} n'est pas exécutée. La variable a disparu en route.
 
WRInaute passionné
Tu n'apelles pas la fonction avec une variable, mais avec un élément de $_GET. Je ^pense que tu ne peux pas modifier
$_GET['rubrique'] ....
Il faut donc passer par une variable temporaire

Code:
APPEL DE LA FONCTION :
if(isset($_GET['rubrique']))
{
$temp = $_GET['rubrique'];
$rubrique=filtre_numerique(&$temp);
}
 
WRInaute occasionnel
Merci MIkeR, je vais essayer cela.

Quand tu dis "une variable temporaire", je n'ai jamais lu qu'il existe des "variables temporaires". C'est juste une expression de ta part, ou alors il existe vraiment des "variables temporaires" avec des fonctions spécifiques ?

Ta remarque sur l'appelle de fonction par $_GET[''] est intéressante, même si je n'ai pas encore vérifié que c'est le problème. Finalement, $_GET[''], c'est quoi ? Vu la présence du $ comme pour toutes les déclarations de variable, je m'étais laissé dire que $_GET[''] était une variable à part entière, mais transmise par l'URL. Or, ta réponse laisse entre qu'il y a la variable $rubrique + une autre chose qui s'appelle $_GET[''].

Je ne sais pas si je suis clair...
 
WRInaute occasionnel
Non, ça ne fonctionne pas non plus.
Par ailleurs ton $ dans ($temp) déclenche une erreur php, MikeR.


En fait, la variable $rubrique parait bel et bien filtrée par la fonction. Mais elle est perdu dans le courant du script lol, puisque par la suite la fonction if(!isset $ rubrique) (require...) est exécutée.

Bon bon, ça avance quand même un peu, faut persévérer...
 
WRInaute occasionnel
Bon alors,

j'ai donc essayé cela, pour appeler la fonction :
Code:
if(isset($_GET['rubrique']))
{
$rubrique = $_GET['rubrique'];
$rubrique=filtre_numerique($rubrique);
echo'<h1>'.$_GET['rubrique'].'</h1>';
}
Le truc curieux, c'est que $_GET['rubrique'] s'affiche bien. Par contre, si je veux faire un echo de vérification avec $rubrique, alors ça n'affiche plus rien.
 
WRInaute occasionnel
La fonction est pourtant bien exécutée, puisque si j'y ajoute echo"test", cela s'affiche sur la page où elle est appelée.

Le problème doit donc être quelque part entre $rubrique et $_GET['rubrique'].

Je monologue, mais ça repose.
 
WRInaute occasionnel
Soyons précis. Si je fais ça :

Code:
if(isset($_GET['rubrique']))
{
$temp = $_GET['rubrique'];
$rubrique=filtre_numerique($temp);
echo'<h1>'.$_GET['rubrique'].' - '.$temp.' - '.$rubrique.'</h1>';
}

$_GET[rubrique] s'affiche.
$temp s'affiche.
$rubrique n'affiche rien.

Au moins, le problème est localisé.
 
Discussions similaires
Haut