[RESOLU] modification dans la base de données

Eléphanteau du PHP | 45 Messages

27 avr. 2015, 15:40

Bonjour,
j'ai un problème dans ma page php, je veux que ma page me permet d'afficher les phases d'une mission et puis les modifier.
jusqu'à maintenant l'affichage se fait correctement mais la modification non. Par exemple j'ai 2 phases la première est modifiée avec sucées mais le deuxième reste elle même et ne se modifie pas et ça m'affiche le message d'erreur suivant "Duplicate entry for key 'PRIMARY'".
D’après ce que je sais que ce message est du à la duplication de la clé primaire donc je déduis que lors de la modification, la première phase est replacée par la première ligne et aussi il modifie la deuxième phase avec la première ligne. Je bloque depuis le matin sur ce problème merci de m'aider
<?php
include("connexion.php");
$req="Select * from phases where nom_miss='$nom_miss'";
$rs=mysql_query($req);

	echo
'<form name="form" method="POST">
			<table class="table table-hover" border=1>
		<tr>
			<th> Nom de la phase </th>
			<th> Date de debut </th>
			<th> Date de fin </th>
			<th> Avancement </th>
		</tr>';
$i=1;		
while ($ligne=mysql_fetch_array($rs))
{
	$nom_phase=$ligne[0];
	$date_debut=$ligne[1];
	$date_fin=$ligne[2];
	$pourcentage=$ligne[3];

echo $i;

		echo '<tr>
			<td><input type="text" name="nom_phase'.$i.'" value="'.$nom_phase.'"></td>
			<td><input type="date" name="date_debut'.$i.'" value="'.$date_debut.'"></td>
			<td><input type="date" name="date_fin'.$i.'" value="'.$date_fin.'" ></td>
			<td><input type="text" name="pourcentage'.$i.'" value="'.$pourcentage.'"></td>
		</tr>';
$i++;
$_SESSION['ct']=$i-1;
}
echo ('ct :'.$_SESSION['ct']);
echo ($_POST["nom_phase2"]);
echo '<div class="col-lg-5">
				<button type="submit" class="btn btn-primary btn-lg btn-block" name="Modifier" value="Modifier">Valider les modifications</button>
	</div>';

 if(isset($_POST["Modifier"])) 	 
{
$ct1=$_SESSION['ct'];
for($j=1;$j<=$ct1;$j++)	
{ 
	$nom_phase1=$_POST["nom_phase$j"];
	$date_debut1=$_POST["date_debut$j"];
	$date_fin1=$_POST["date_fin$j"];
	$pourcentage1=$_POST["pourcentage$j"];
	
	$req1="UPDATE phases SET 
				nom_phase='$nom_phase1',
				date_debut='$date_debut1',
				date_fin='$date_fin1',
				pourcentage='$pourcentage1'	
			where nom_miss='$nom_miss'";
mysql_query($req1) or exit (mysql_error());
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 avr. 2015, 18:05

Hello,

Quelle est la clé primaire de ta table phases ? il semble que l'un des update tente de mettre à jour cette clé avec une valeur déjà utilisée en base. La base de données renvoi donc une erreur puisque la clé primaire aurait alors un doublon.

Quand tu rencontres une erreur en sql, affiche la requête qui est envoyée au serveur, cela peut également aider à trouver celle qui a généré l'erreur et comprendre d'où vient le problème :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 45 Messages

27 avr. 2015, 18:12

Merci @Ryle pour votre réponse ,
Oui c'est sa le problème j'arrive pas à trouver le problème dans ma requête SQL . Ma clé primaire est nom_phase

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 avr. 2015, 23:42

Ok, en fait le problème vient de ton update lorsque tu as plusieurs enregistrements associés à un $nom_miss :
$req1="UPDATE phases SET 
				nom_phase='$nom_phase1',
				date_debut='$date_debut1',
				date_fin='$date_fin1',
				pourcentage='$pourcentage1'	
			where nom_miss='$nom_miss'";
Ne connaissant pas le propos de ton script, ce n'est pas évident à expliquer mais en gros, cet update va mettre à jour tous les enregistrement de ta table "phase" pour lesquels la colonne nom_miss a pour valeur $nom_miss.

Telle qu'elle est conçue, ta boucle va prendre chacune des lignes du formulaire et faire un update de tous les enregistrements en base (pour un même $nom_miss). Le problème c'est donc qu'elle met également à jour la clé primaire de tous les enregistrements. Si par exemple tu as une phase A et une phase B, ta boucle va mettre à jour ces 2 nom_phase avec la valeur A, puis mettre à jour les deux nom_phase avec la valeur B. C'est ce qui provoque l'erreur SQL, puisque tu ne peux pas avoir 2 fois la même valeur pour une clé primaire.

A priori, je dirais que la solution consiste à modifier ta requête SQL pour que la clé primaire soit dans le WHERE, mais je ne sais pas si cela correspond à ce que tu veux faire fonctionnellement :
$req1="UPDATE phases SET 
				date_debut='$date_debut1',
				date_fin='$date_fin1',
				pourcentage='$pourcentage1'	
			where nom_miss='$nom_miss'
				and 	nom_phase='$nom_phase1' ";
Ca ne met plus à jour nom_phase, mais ça l'utilise pour mettre à jour l'enregistrement (c'est l'intérêt d'une clé primaire :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 45 Messages

29 avr. 2015, 16:44

@Ryle merci infiniment pour votre réponse avec la correction du requéte update j'ai aussi changé ma clef primaire en créant une nouvelle ID et du coût sa marche bien merci infiniment :D