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

Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 13, 2017 18:16

Bonjour,

J'utilise un checkbox, comme suit :
Code: Tout sélectionner
<input type="checkbox" name="site[]" value="1">
<input type="checkbox" name="site[]" value="2">

Je filtre ensuite avec une remarquable composition personnelle, qui a l'extrême mérite de ne renvoyer aucun message d'erreur, n'en déplaise aux jaloux :
Code: Tout sélectionner
foreach ($_POST['site'] as $site)
{$site=FILTER_VAR($site, FILTER_SANITIZE_NUMBER_INT);}

Néanmoins, le résultat a ceci d'éclectique, qu'il ne m'affiche que la dernière seconde checkbox de la liste. Histoire d'enquiquiner le peuple, quoi.

Donc déjà, si vous avez une idée pour raisonner la bestiole, je vous en remercie par avance.

QUI PLUS EST, le challenge ne s'arrête pas là. Il s'agit ensuite d'effectuer une requête SQL qui va aller chercher tous les titres correspondants au tableau site[] précédemment filtré, en théorie du moins.
La question est donc de savoir comment faire (en deux mots, juste pour la clause where). Je viens d'essayer avec une fonction implode(), mais OVH m'a envoyé un fax m'expliquant que l'erreur ainsi générée risquait de faire griller l'intégralité de son parc de serveurs, donc j'ai pas insisté.


Encore merci hein...
Modifié en dernier par Alorsladaccord le Lun Mar 13, 2017 18:35, modifié 1 fois.
Haut
16 Réponses
Messages: 12288

Enregistré le: 23 Nov 2005

Message le Lun Mar 13, 2017 18:29

Code: Tout sélectionner
<input type="checkbox" name="site[]" value="1">
<input type="checkbox" name="site[]" value="2">


Il manque le [] dans l'attribut name du 2e champ.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 13, 2017 18:37

Salut UsagiYojimbo !


Hem... Oui enfin là non, c'eut été trop facile. J'ai seulement fait une erreur en écrivant le sujet.

Déjà, avant de préciser le code informatique, en bon français ça donne quoi ?
1) Je récupère le tableau de variable retourné par les champs checkbox name="site[]".
2) Je filtre chacune de ces variables avec la fonction SANITIZE_
3) Je récupère chacune de ces variables filtrées dans un nouveau tableau.
4) Je crée une requête SQL qui va afficher le titre de chaque valeur du tableau[]

C'est ça ?
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 13, 2017 18:44

Je n'en reviens pas de ne pas trouver sur internet, la réponse toute faite à une question correspondant à un usage aussi courant des formulaires.
Haut
Messages: 12288

Enregistré le: 23 Nov 2005

Message le Lun Mar 13, 2017 18:50

Code: Tout sélectionner
foreach ($_POST['site'] as $site)
{$site=FILTER_VAR($site, FILTER_SANITIZE_NUMBER_INT);}


Avec ça, tu ne gardes en effet que la valeur de la dernière checkbox. Tu dis que tu crées un tableau où tu stockes les différentes valeur, je ne le vois pas vraiment dans ton bout de code.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 13, 2017 18:57

Bah justement, je suis en train de chercher comment faire.
Quand tu dis "Avec ça, tu ne gardes en effet que la valeur de la dernière checkbox", tu signifies que seule la valeur de la dernière checkbox est filtrée, ou alors que seule la valeur de la dernière checbock peut être affichée ?
Et je ne vois pas pourquoi je devrais recréer un tableau à partir des variables précédemment filtrées, au lieu de conserver tout bonnement ce même tableau dorénavant filtré.
Haut
Messages: 140

Enregistré le: 17 Oct 2009

Message le Lun Mar 13, 2017 19:15

Mais... tu utilise le même nom pour tes case à cocher ?
Si oui, tu dois leur donner des nom différents, sinon ton tableau $_POST ne pourra contenir que la dernière checkbox. Les clés d'un tableau sont uniques.

Code: Tout sélectionner
<input type="checkbox" name="checkbox1" value="bim" />
<input type="checkbox" name="checkbox2" value="bam" />
<input type="checkbox" name="checkbox3" value="boum" />
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Lun Mar 13, 2017 19:18

@niap: non on px faire un name="foo[]" et $_POST['foo'] sera un array avec toutes les values ;)

@Alorsladaccord: tu n'as pas vraiment besoin de faire de filter_var si tu utilises bien les requêtes préparées :
http://stackoverflow.com/a/920523/1656355
Haut
Messages: 140

Enregistré le: 17 Oct 2009

Message le Lun Mar 13, 2017 19:45

spout a écrit:@niap: non on px faire un name="foo[]" et $_POST['foo'] sera un array avec toutes les values ;)

Ah, je connaissais pas, merci.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Lun Mar 13, 2017 19:52

niap a écrit:Mais... tu utilise le même nom pour tes case à cocher ?]

Ah, la syntaxe nom_checkbox[] n'est valable que pour les tableaux générées dynamiquement à partir d'un while ou d'un foreach ? Sans quoi il faut écrire nom_checkbox[1], nom_checkbox[2] ? Je ne me rappelle pas de cela.
Il me semble que je stipule au formulaire que je crée un tableau de checkbox et c'est la valeur de chaque checkbox que je change via value="".
Donc
<input type="checkbox" name="nom_checkbox[]" value="1">


Si oui, tu dois leur donner des nom différents, sinon ton tableau $_POST ne pourra contenir que la dernière checkbox. Les clés d'un tableau sont uniques.

Bah oui, mais les clefs ce sont les valeurs retournées via value="", non ?

spout a écrit:@niap: non on px faire un name="foo[]" et $_POST['foo'] sera un array avec toutes les values ;)

@Alorsladaccord: tu n'as pas vraiment besoin de faire de filter_var si tu utilises bien les requêtes préparées :
http://stackoverflow.com/a/920523/1656355

Effectivement, pour les requêtes préparées, je n'y avais pas pensé. Serait-ce pour cette raison que nulle part dans le W W W on ne trouve la réponse à ma question ?

Et concrètement, quelle serait la version correcte du bout de code donné par UsagiYojimbo ?


NB : pour être honnête, je vais régler le problème au coup par coup, via une page spéciale. Mais bon, la solution reste intéressante à connaître.
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Lun Mar 13, 2017 20:35

Code: Tout sélectionner
<?php
$sites 
= array_map(function ($val) {
    return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
},
 $_POST['site']); 

https://3v4l.org/D14bS
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 14, 2017 14:00

Salut spout, merci pour ta réponse, comme d'hab' (reco au passage, of course). Et pour les autres aussi. Ah bah c'est pas possible, c'est limité à une, désolé.

Ce qui m'intrigue dans le bout de code que tu nous proposes, spout, c'est la présence de cette $val.
Si je traduis en français ton bout de code, est-ce que ça donne ça :
Je crée une variable $sites, à partir de la fonction array_map qui nécessite la création "à la volée" d'une variable $val réceptionnant le contenu de $_POST['site'] sur lequel la fonction Sanitize vient d'être appliquée.


J'ai bon ? Si oui, pourquoi ne pas appliquer la fonction array_map directement sur la variable $sites, elle aussi créée (instanciée ?) à la volée ?

Ah hem...
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mar 14, 2017 14:48

Heu je sais bien que tu n'aimes pas la doc, mais c'est clairement expliqué:
http://php.net/manual/fr/function.array-map.php
array_map — Applique une fonction sur les éléments d'un tableau


il y avait moyen aussi avec un foreach (en utilisant l'index, ou par référence, cfr. doc).
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 14, 2017 15:37

Bah justement je suis en train d'essayer cela, avec un foreach (fonction que j'utilise en général fort peu) :

Code: Tout sélectionner
$attribution_site = array_map(function ($val)
{
return filter_var($val, FILTER_SANITIZE_NUMBER_INT);
}, $_POST['attribution_site']);
 
 
  foreach($attribution_site as $attribution)
    {
 $sql = "UPDATE perso_auteur SET attribution_site=1 WHERE id='.$attribution.'";
 $stmt = $dbh->prepare ($sql); /* On prépare la requête */
 $stmt->execute();
 ;}//ferme foreach
;}//ferme isset premiere_attribution


La logique générale me semble bonne :
1) Je récupère un tableau de checkbox name="attribution_site[]" dont je filtre chaque ligne grâce à la fonction array_map que tu nous indiques.
Puis pour chaque entrée, je fais l'update dans le tuple correspondant à l'id de cette entrée.

Après, doit y'avoir quelques erreurs de syntaxe, parce que code est d'une efficience grandiose, on se comprend... Encore qu'il ne génère aucune erreur spécifique, juste un résultat nul.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 14, 2017 15:44

Y'a de toute façon un problème, puisque si j'essaie d'afficher :
Code: Tout sélectionner
echo''.$attribution_site.'';

juste avant la ligne
Code: Tout sélectionner
  foreach($attribution_dicopsy as $attribution)


ça affiche "array".

Pfouuu les tableaux, va falloir que je me farcisse un tuto' de a à z.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 14, 2017 16:02

J'obtiens toutefois un résultat un peu moins lamentable avec vardump().


Ne pas se moquer, merci.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 14, 2017 16:14

Ah ah ah ! ça vient de sauvagement marcher ! J'ai juste changer les ' ' pour des "" dans les paramètres de la requête.

Hin hin, je suis trop bon, même pas besoin de vous, allez salut @plus les noob.





Non je plaisante, partez pas, on sait jamais...
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.