UPDATE dans array() qui ne fonctionne pas

Résolu
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -  
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
 
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
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
 
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
Sinistrus Messages postés 1010 Date d'inscription   Statut Membre Dernière intervention   17
 
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