UPDATE dans array() qui ne fonctionne pas

Résolu
Bonjour,

J'essaie de faire un update d'un array() mais c'est le même dernier enregistrement qui se répète sur toutes les lignes, vous pouvez m'aider svp ?
$SLCT = !empty($_POST['Fr_Selection']) ? $_POST['Fr_Selection'] : array();
 
try{
  foreach($SLCT as $key => $value){
  $UP = $pdo->prepare("UPDATE tb_jeu_can_R SET $JEU=:SLCT WHERE Pseudo = '".$Pseudo."'");
    $UP->bindParam(":SLCT", $value);
    $UP->execute();
  }
} catch (PDOException $e) {echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}
	
print_r($_POST);
 
//Résultat du $_post
Array ( [Fr_Selection] => Array ( [0] => CIV [1] => CMR [2] => BDI [3] => EGY [4] => GIN [5] => GNB [6] => MDG [7] => NAM ) [Btn_Envoyer] => )

Merci d'avance

Configuration: Windows / Chrome 74.0.3729.169

4 réponses

  1. Contributeur
    bonjour, je suis étonné de lire que tu fais une boucle avec plusieurs UPDATE, mais que le WHERE soit à chaque fois identique.
    d'où vient $Pseudo? à quoi sert $key?
    par ailleurs, tu écris vouloir faire un update d'un array(), et il me semble que tu mets à jour des données dans une base de données SQL.
    je ne comprends pas bien "le même dernier enregistrement qui se répète sur toutes les lignes,": peux-tu donner un exemple?
    1. Merci yg_be de t'intéresser à mon poste.

      Voici les données réelles et comment il se comporte.

      Les données sont générés et testés. Je les mets en variables car pseudo change selon l'utilisateur et $JEU varie selon la colonne a mettre à jour :
      $Pseudo = "JOHN";
      $JEU = "Data_2";


      Valeur réels a ajouter (8 lignes) :
      CMR
      CIV
      EGY
      GHA
      GIN
      GNB
      MDG
      KEN


      Récupérés depuis des <option> générés dans ce select :
      <select name="Fr_Selection[]" multiple></select>


      Table
      tb_jeu_can_R
      à mettre à jour (16 lignes existent déjà) :
      Pseudo  | Data_1   | Data_2 
      -------------------------------
      JOHN	| BDI	   | KEN
      JOHN	| CMR	   | KEN
      JOHN	| CIV	   | KEN
      JOHN	| EGY	   | KEN
      JOHN	| GIN	   | KEN
      JOHN	| GNB	   | KEN
      JOHN	| KEN	   | KEN
      JOHN	| MDG	   | KEN
      JOHN	| MAR	   | KEN
      JOHN	| MLI	   | KEN
      JOHN	| NAM	   | KEN
      JOHN	| MRT	   | KEN
      JOHN	| NGA	   | KEN
      JOHN	| UGA	   | KEN
      JOHN	| COG	   | KEN
      JOHN	| GHA	   | KEN


      Résultat souhaité :
      Pseudo  | Data_1   | Data_2 
      -------------------------------
      JOHN	| BDI	   | CMR
      JOHN	| CMR	   | CIV
      JOHN	| CIV	   | EGY
      JOHN	| EGY	   | GHA
      JOHN	| GIN	   | GIN
      JOHN	| GNB	   | GNB
      JOHN	| KEN	   | MDG
      JOHN	| MDG	   | KEN
      JOHN	| MAR	   | 
      JOHN	| MLI	   | 
      JOHN	| NAM	   | 
      JOHN	| MRT	   | 
      JOHN	| NGA	   | 
      JOHN	| UGA	   | 
      JOHN	| COG	   | 
      JOHN	| GHA	   | 


      HTML :
      <select name="Fr_Selection[]" multiple="">
      <option value="CMR">CMR</option>
      <option value="CIV">CIV</option>
      <option value="EGY">EGY</option>
      <option value="GHA">GHA</option>
      <option value="GIN">GIN</option>
      <option value="GNB">GNB</option>
      <option value="MDG">MDG</option>
      <option value="KEN">KEN</option>
      </select>


      Je ne sais pas s'il manque autre chose mais voilà.
      1. J'ai testé l'INSERT et il fonctionne bien, mais le UPDATE a le même problème.
        Voici le code de l'INSERT :
        	try{foreach($SLCT as $i) {
        	$AD = $pdo->prepare ("INSERT INTO tb_jeu_can_R (Pseudo, $JEU) VALUES (:Pseudo, :$JEU)");
        	$AD ->execute(array("Pseudo" => $Pseudo, $JEU => $i));
        	}
        	} catch (PDOException $e) {echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}
    2. Contributeur
      Je comprends un peu mieux ce que tu veux réaliser.
      Je pense que la structure des tables n'est pas optimale. Comme je ne sais pas ce que tu essaies de représenter, ni ce que tu vas faire avec les données il m'est difficile de te conseiller.
      Cependant, je pense à différentes options:
      1) garder la structure, et faire un INSERT également pour data_2
      2) utiliser 2 tables différentes, une avec Pseudo, Data_1, l'autre avec Pseudo, Data_2
      3) ajouter un numéro unique à la table, qui deviendrait Pseudo, num, Data_1, Data_2
      4) insérer simultanément Data_1 et Data_2
      5) changer la table, et avoir des colonnes pseudo, jeu, data. ainsi:

      Pseudo | Jeu | Data
      -------------------------------
      JOHN | 2 | CMR
      JOHN | 2 | CIV
      JOHN | 2 | EGY
      JOHN | 2 | GHA
      JOHN | 2 | GIN
      JOHN | 2 | GNB
      JOHN | 1 | BDI
      JOHN | 1 | CMR
      JOHN | 1 | CIV
      JOHN | 1 | EGY
      JOHN | 1 | GIN
      JOHN | 1 | GNB
      1. J'ai omis de mettre à jour Data_2 selon Data_1
        Merci de ton aide yg_be !
        try{
          $UP = $pdo->prepare("UPDATE tb_jeu_can_R SET $JEU=:$JEU WHERE Pseudo='".$Pseudo."' AND Data_1=:$JEU");
          foreach($SLCT as $i){
          $UP->execute(array($JEU => $i));
          }
        } catch (PDOException $e) {echo "<div class='alert alert-danger'>".$e->getMessage()."</div>";}


        Ainsi il met à jour uniquement là où le pseudo existe les données selon Data_1 :
        Pseudo  | Data_1   | Data_2 
        -------------------------------
        JOHN	| BDI	   | 
        JOHN	| CMR	   | CMR
        JOHN	| CIV	   | CIV
        JOHN	| EGY	   | EGY
        JOHN	| GIN	   | GIN
        JOHN	| GNB	   | GNB
        JOHN	| KEN	   | KEN
        JOHN	| MDG	   | MDG
        JOHN	| MAR	   | 
        JOHN	| MLI	   | 
        JOHN	| NAM	   | 
        JOHN	| MRT	   | 
        JOHN	| NGA	   | 
        JOHN	| UGA	   | 
        JOHN	| COG	   | 
        JOHN	| GHA	   | GHA