Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 28, 2017 17:35

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: Tout sélectionner
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: Tout sélectionner
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 !
Haut
18 Réponses
Messages: 148

Enregistré le: 19 Oct 2016

Message le Mar Mar 28, 2017 17:47

Bonjour,

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

Enregistré le: 9 Jan 2010

Message le Mar Mar 28, 2017 21:51

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
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 14:01

Salut à vous,

klp a écrit: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 écrit: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....
Haut
Messages: 148

Enregistré le: 19 Oct 2016

Message le Mer Mar 29, 2017 15:25

Alorsladaccord a écrit: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.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 15:46

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
Haut
Messages: 12290

Enregistré le: 23 Nov 2005

Message le Mer Mar 29, 2017 15:47

Tu affectes bien le résultat de ta fonction à une variable ?
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 16:54

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: Tout sélectionner
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.
Haut
Messages: 12290

Enregistré le: 23 Nov 2005

Message le Mer Mar 29, 2017 16:56

Si tu veux afficher le résultat, il manque un echo...
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 18:19

Mais je ne veux pas afficher de résultat, donc je n'ai pas besoin d'echo. Je replace le bout de code :
Code: Tout sélectionner
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.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 18:20

Ah, peut-être dois-je faire :
Code: Tout sélectionner
$rubrique=filtre_tableau($_GET['rubrique']) ;


:?: :idea:
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 29, 2017 18:28

Non plus.

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

Code: Tout sélectionner
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: Tout sélectionner
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.
Haut
Messages: 1700

Enregistré le: 9 Jan 2010

Message le Jeu Mar 30, 2017 13:18

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: Tout sélectionner
APPEL DE LA FONCTION :
if(isset($_GET['rubrique']))
{
$temp = $_GET['rubrique'];
$rubrique=filtre_numerique(&$temp);
}
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 16:44

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...
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 17:09

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...
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 17:26

Bon alors,

j'ai donc essayé cela, pour appeler la fonction :
Code: Tout sélectionner
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.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 17:44

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.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 17:46

Soyons précis. Si je fais ça :

Code: Tout sélectionner
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é.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Jeu Mar 30, 2017 17:59

Pfff, z'êtes pas doués les gars, manquait le return...
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.