Foreach sur 2 clés [Résolu]

Signaler
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
-
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
-
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é.

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

Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877
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;
}
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1
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
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877
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
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1 >
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021

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
Messages postés
33114
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 juillet 2021
3 627
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..
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1
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
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877
as-tu compris cette recommendation? j'ai l'impression que tu ne l'as pas appliquée.
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1 >
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021

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.
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877 >
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021

tu n'as pas du tout appliqué cette recommendation.
je pense que cela te permettra également de supprimer la ligne 77 de ton formulaire.
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1
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 fonctionner
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
    //$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] ...
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877 >
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021

Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1 >
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021

Le lien m'amène juste sur une page de traduction qui traduit l'avertissement d'anglais en français mais il n'explique pas comment y remédier.
Messages postés
33114
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 juillet 2021
3 627 >
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021

foreach($_POST['Participationmod'] as $cle => $element)
{
Messages postés
81
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
28 juin 2021
1 >
Messages postés
33114
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 juillet 2021

OK. Vu la différence.
Merci
Je passe le fil en résolu.
Messages postés
16406
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 juillet 2021
877
ton utilisation du prepare/execute n'est pas correcte.
regarde comment tu fais au début du code partagé en #4.