UPDATE dans array() qui ne fonctionne pas

Résolu/Fermé
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 14 juin 2019 à 22:20
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 15 juin 2019 à 12:51
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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
14 juin 2019 à 22:28
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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
15 juin 2019 à 12:08
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 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
14 juin 2019 à 23:09
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 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
14 juin 2019 à 23:29
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 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
15 juin 2019 à 12:51
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