Foreach sur 2 clés

Résolu/Fermé
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 25 juin 2021 à 16:41
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 26 juin 2021 à 19:05
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
A voir également:

5 réponses

yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 Ambassadeur 1 557
25 juin 2021 à 17:00
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;
}
1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
26 juin 2021 à 01:12
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
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557
26 juin 2021 à 10:57
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
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024
26 juin 2021 à 14:59
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
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719
26 juin 2021 à 02:26
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..
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
26 juin 2021 à 07:48
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
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557
26 juin 2021 à 15:17
as-tu compris cette recommendation? j'ai l'impression que tu ne l'as pas appliquée.
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024
26 juin 2021 à 15:33
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.
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557 > danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024
26 juin 2021 à 15:46
tu n'as pas du tout appliqué cette recommendation.
je pense que cela te permettra également de supprimer la ligne 77 de ton formulaire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
26 juin 2021 à 17:37
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] ...
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557
Modifié le 26 juin 2021 à 18:00
as-tu essayé
$_POST[Participationmod]
?

(dans la ligne 1)
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557
26 juin 2021 à 18:03
ton utilisation du prepare/execute n'est pas correcte.
regarde comment tu fais au début du code partagé en #4.
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024
26 juin 2021 à 18:23
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.
0
yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024 1 557 > danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024
26 juin 2021 à 18:29
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 23412 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 décembre 2024
26 juin 2021 à 18:46
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.
0