Deux questions à propos des tableaux de variable

Alorsladaccord

WRInaute occasionnel
Bonjour,

J'utilise un checkbox, comme suit :
Code:
<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:
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...
 

UsagiYojimbo

WRInaute accro
Code:
<input type="checkbox" name="site[]" value="1">
<input type="checkbox" name="site[]" value="2">

Il manque le [] dans l'attribut name du 2e champ.
 

Alorsladaccord

WRInaute occasionnel
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 ?
 

Alorsladaccord

WRInaute occasionnel
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.
 

UsagiYojimbo

WRInaute accro
Code:
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.
 

Alorsladaccord

WRInaute occasionnel
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é.
 

niap

WRInaute discret
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:
<input type="checkbox" name="checkbox1" value="bim" />
<input type="checkbox" name="checkbox2" value="bam" />
<input type="checkbox" name="checkbox3" value="boum" />
 

Alorsladaccord

WRInaute occasionnel
niap a dit:
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 dit:
@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.
 

spout

WRInaute accro
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$sites </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> array_map</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">function </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$val</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    return filter_var</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$val</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> FILTER_SANITIZE_NUMBER_INT</span><span class="syntaxkeyword">);<br />},</span><span class="syntaxdefault"> $_POST</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'site'</span><span class="syntaxkeyword">]);&nbsp;</span><span class="syntaxdefault"></span>
https://3v4l.org/D14bS
 

Alorsladaccord

WRInaute occasionnel
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...
 

Alorsladaccord

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

Code:
$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.
 

Alorsladaccord

WRInaute occasionnel
Y'a de toute façon un problème, puisque si j'essaie d'afficher :
Code:
echo''.$attribution_site.'';
juste avant la ligne
Code:
  foreach($attribution_dicopsy as $attribution)

ça affiche "array".

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

Alorsladaccord

WRInaute occasionnel
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...
 

Discussions similaires

Haut