Foreach sur 2 clés
Résolu
danielos77
Messages postés
109
Statut
Membre
-
danielos77 Messages postés 109 Statut Membre -
danielos77 Messages postés 109 Statut Membre -
Bonjour,
A partir d'un tableau associatif du genre :
$cle1 s'appelle b et à pour valeur b
$clé2 s'appelle motb et à pour valeur TOTO
$cle3 s'appelle c et à pour valeur c
$clé4 s'appelle motc et à pour valeur TATA
Etc..
Comment puis-je écrire un foreach pour qu'une requête d'upgrade, à l'ID x (b, puis c, puis…) donne à un champ machin, la valeur de la clé qui porte le nom de motx (x étant la valeur de l'ID) ?
J'ai bien ça comme début mais je bloque au moment de récupérer dans une variable la valeur de la seconde clé.
Merci d'avance à mon sauveur
Daniel.
A partir d'un tableau associatif du genre :
$cle1 s'appelle b et à pour valeur b
$clé2 s'appelle motb et à pour valeur TOTO
$cle3 s'appelle c et à pour valeur c
$clé4 s'appelle motc et à pour valeur TATA
Etc..
Comment puis-je écrire un foreach pour qu'une requête d'upgrade, à l'ID x (b, puis c, puis…) donne à un champ machin, la valeur de la clé qui porte le nom de motx (x étant la valeur de l'ID) ?
J'ai bien ça comme début mais je bloque au moment de récupérer dans une variable la valeur de la seconde clé.
foreach($_POST as $cle => $element)
{
echo 'la clé [' . $cle . '] contient la valeur ' . $element . '<br />'; // pour contrôler la valeur de la clé et son contenu (ce qui correspond au x de la demande)
$particip="mot".$element;
echo $particip.'<br>'; // pour vérifier que l'on récupère bien la clé2
//blocage ici pour récupérer la valeur de la clé 2 dans une variable
//$sth appartient à la classe PDOStatement
$sth = $bdd->prepare("UPDATE table SET champmachin = $element2 WHERE ID = ". $element);
$sth->execute(array($_POST));
}
Merci d'avance à mon sauveur
Daniel.
Configuration: Windows / Firefox 89.0
5 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
il est peut-être préférable d'enregistrer différemment les informations dans le tableau associatif.
si tu veux vraiment utiliser un for each, il faut, une fois sur deux, extraire $element2 au lieu d'$element, exemple:$impair = TRUE; foreach($_POST as $cle => $element) { echo 'la clé [' . $cle . '] contient la valeur ' . $element . '<br />'; // pour contrôler la valeur de la clé et son contenu (ce qui correspond au x de la demande) $particip="mot".$element; echo $particip.'<br>'; // pour vérifier que l'on récupère bien la clé2 //blocage ici pour récupérer la valeur de la clé 2 dans une variable if ($impair) { $element1=$element; } else { $element2=$element; //$sth appartient à la classe PDOStatement $sth = $bdd->prepare("UPDATE table SET champmachin = $element2 WHERE ID = ". $element); $sth->execute(); } $impair= ! $impair; } -
Bonsoir,
Hormis le fait que ta suggestion ne semble pas fonctionner (même si cela provient sûrement de l'interface entre mon clavier et mon fauteuil), j'ai 2questions.
1°) Pour $impair, ma clé pour l'ID n'est pas systématiquement impaire (mon ID peut-être pair). Est-ce que cela a un impact.
2°) Quel est la traduction et le rôle de $impair=!$impair
Merci
Daniel-
1) la variable $impair a pour but de déterminer si on traite un clé paire ou impaire.
2) https://www.php.net/manual/fr/language.operators.logical.php- Bonjour yg_be,
Merci pour les précisions. Je pensais (à tort) que dans un tableau associatif, les clés n'avaient que les noms qui leur étaient donnés et donc que 1ère ou 2ème ou etc ... n'avait plus de sens. Mais je comprends maintenant que malgré le nom qu'elles ont, l'ordre reste un moyen de les identifier.
Merci
Daniel
-
-
Bonjour
Comme l'a dit yg, le souci vlent avant tout de la façon dont tu as réalisé ton formulaire...
Montre le nous..
-
Bonjour jordane45,
bonjour yg_be,
Voici le formulaire :<?php // met en "dur" la saison echo '<p> </p> Saison traitée : <font size="5" color="blue"><b>'.$Saison.'</b></font><br><br>'; echo "<FORM name='1' action='../envoi_gestion.php' method='POST'><br>"; //préparation de la requête //echo $sql; $sql =' SELECT Inscriptions_ULM.ID,Inscriptions_ULM.Nom, Inscriptions_ULM.Prenom, Inscriptions_ULM.ChoixStage, Inscriptions_ULM.Participationphys, Stages_ULM.TypeStage, Stages_ULM.LieuStage FROM Inscriptions_ULM INNER JOIN Stages_ULM ON Inscriptions_ULM.ChoixStage = Stages_ULM.NumStage WHERE Stages_ULM.Saison = ?'; //tri des datas pour les avoir dans un tableau $datas = array($Saison); //Execution de la requete try{ $req = $bdd->prepare($sql); $req->execute($datas); //on récupère les résultats $result = $req->fetchAll(); }catch(Exception $e){ // en cas d'erreur : echo " <br>Erreur ! ".$e->getMessage(); echo " <br>Les datas : " ; print_r($datas); } // Mise en forme des résultats pour les champs voulus if(!empty($result)){ // Masque du tableau séparé pour ne pas le recopier à chaque ligne echo ' <table style="border-collapse:collapse;" cellspacing="0" class="avectri" border="1"> <thead> <tr> <!-- masque du tableau --> <th style="border-width:1; border-color:black; border-style:solid;">ID</th> <th style="border-width:1; border-color:black; border-style:solid;">Nom</th> <th style="border-width:1; border-color:black; border-style:solid;">Prénom</th> <th style="border-width:1; border-color:black; border-style:solid;">Choix Stage</th> <th style="border-width:1; border-color:black; border-style:solid;">TypeStage</th> <th style="border-width:1; border-color:black; border-style:solid;">LieuStage</th> <th style="border-width:1; border-color:black; border-style:solid;">Participation Physique</th> <th style="border-width:1; border-color:black; border-style:solid;">Saisie Participation Physique</th> </tr> </thead> <tbody> '; foreach($result as $uneLigne){ // Suite du tableau avec une ligne par groupe de données //récupération de l'ID de la ligne pour le renvoyer avec un input hidden $ID=$uneLigne['ID']; //utilisation de l'ID pour créer la variable qui nommera chaque select $Participationmod="Participationmod".$ID; echo' <tr> <!-- lignes des résultats --> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['ID'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['Nom'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['Prenom'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['ChoixStage'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['TypeStage'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['LieuStage'].'</td> <td style="border-width:1; border-color:black; border-style:solid;">'.$uneLigne['Participationphys'].'</td> <td style="border-width:0; border-color:black; border-style:solid;"><font size="4"><label for="Participationmod">Participation : </label> <input type="hidden" name="'.$ID.'" id="'.$ID.'" value="'.$ID.'"> <select name="'.$Participationmod.'" id="'.$Participationmod.'"> <option value="">--Choisissez une option--</option> <option value="OUI">OUI</option> <option value="NON">NON</option> </select> </font> </td> </tr> '; } echo '</tbody> </table> '; } echo "<br><Input type='submit' name='envoyer' value='Saisie des participations'>"; echo "</form>"; ?>
La fonctionnalité du formulaire est la gestion des participations ou pas à des stages. Il récupère les inscriptions de l'année choisie, et pour chaque inscription, le select en fin de ligne permet de mettre "OUI" ou "NON". La validation du formulaire devant faire l'upgrade de cette information dans la table pour chaque enregistrement.
Merci à vous 2 pour votre aide.
Daniel-
as-tu compris cette recommendation? j'ai l'impression que tu ne l'as pas appliquée.
- Oui, j'ai compris la recommandation.
C'est vrai par contre que je ne l'ai pas appliquée tel quel car je suis passé par la création d'une variable ($Participationmod en ligne 64 avec la valeur de l'ID récupérée en ligne 62) pour nommer les select. Variable qui a bien le même nom que la recommandation. Du moins je le pense mais tu me mets un gros doute sur le fait que ce serait équivalent.
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
effectivement, j'ai appliqué la recommandation et le résultat est différent ;-)
le dump et le print_r me donnent :
array(2) { ["Participationmod"]=> array(7) { [1]=> string(0) "" [2]=> string(3) "OUI" [3]=> string(3) "OUI" [4]=> string(3) "OUI" [5]=> string(3) "OUI" [76]=> string(3) "OUI" [77]=> string(0) "" } ["envoyer"]=> string(25) "Saisie des participations" }
Array
(
[Participationmod] => Array
(
[1] =>
[2] => OUI
[3] => OUI
[4] => OUI
[5] => OUI
[76] => OUI
[77] =>
)
[envoyer] => Saisie des participations
)
Si je comprend bien, là j'obtiens un tableau qui contient un tableau où en clé je retrouve l'ID et en valeur le choix du select.
mais comment ça se traite ça ?
ma requête ne peut fonctionnerforeach($_POST as $cle => $element) { echo 'La clé [' . $cle . '] contient la valeur : ' . $element . '<br />'; // pour contrôler la valeur de la clé et son contenu //$sth appartient à la classe PDOStatement $sth = $bdd->prepare("UPDATE Inscriptions_ULM SET Participationphys = $element WHERE ID = $cle"); $sth->execute(array($_POST)); }
à moins que pour l'execute je doive indiquer le tableau [Participationmod] ...-
-
-
Non, j'avais pas essayé $_POST[Participationmod]... on peut pas dire que la syntaxe permette l'intuition...
Sinon, pour la requête, j'ai modifié ainsi:foreach($_POST[Participationmod] as $cle => $element) { echo 'La clé [' . $cle . '] contient la valeur : ' . $element . '<br />'; // pour contrôler la valeur de la clé et son contenu //$sth appartient à la classe PDOStatement $sth = $bdd->prepare('UPDATE Inscriptions_ULM SET Participationphys = :element WHERE ID = :cle'); $sth->bindValue(':element', $element, PDO::PARAM_STR); $sth->bindValue(':cle', $cle, PDO::PARAM_INT); $sth->execute(); }
Cela fonctionne mais j'ai un message de mise en garde me disant que j'utilise une constante non définie (Participationmod) et que cela posera pb avec les futures versions php "Warning: Use of undefined constant Participationmod - assumed 'Participationmod' (this will throw an Error in a future version of PHP)"
En tout cas un grand merci pour le coup de main. -
Fais alors comme expliqué dans l'avertissement.
https://www.deepl.com/translator#en/fr/Use%20of%20undefined%20constant%20Participationmod%20-%20assumed%20'Participationmod' -
-