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
    1. 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
      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à.
        0
        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>";}
          0
      2. 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
        0