Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 12h34   #1
Invité de passage
 
Homme
Inscription : novembre 2006
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2006
Messages : 3
Points : 1
Points : 1
Par défaut UPDATE: ERROR DUPLICATE ENTRY FOR KEY PRIMARY

Bonjour à tous !

Malgrè mes nombreuses recherches sur plusieurs Forums, je n'ai pas trouvé de solutions.


Voici mon cas :

Je gère un petit club de football, le but étant de créér des statistiques pour chaque joueur.
(présence aux entrainements, temps de jeu, buts, passes, carton jaunes et carton rouges).


Après chaque entrainement ou match je souhaite, via une interface php/html, mettre à jour les données de la base (plus précisément de la "Table scl_stats_joueurs") pour chaque joueur en une seule fois.


I. PARTIE SQL :

Trois tables sont utilisées dans la gestion des statistiques: scl_membres, scl_saisons, scl_stats_joueurs.

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--
-- Structure de la table `scl_membres`
--
 
DROP TABLE IF EXISTS `scl_membres`;
CREATE TABLE IF NOT EXISTS `scl_membres` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `login` varchar(20) NOT NULL,
  `pass_md5` varchar(250) NOT NULL,
  `nom` varchar(50) NOT NULL,
  `prenom` varchar(50) NOT NULL,
  `surnom` varchar(50) NOT NULL,
  `date_naissance` date NOT NULL,
  `num_licence` int(10) NOT NULL,
  `id_joueurs` smallint(5) NOT NULL,
  `adresse1` varchar(50) NOT NULL,
  `adresse2` varchar(50) NOT NULL,
  `cp` mediumint(5) NOT NULL,
  `ville` varchar(100) NOT NULL,
  `mail` varchar(100) NOT NULL,
  `tel_p` varchar(14) NOT NULL,
  `tel_f` varchar(14) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `lastquerytime` bigint(20) NOT NULL,
  `admin` enum('0','1','2','3') NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
 
 
--
-- Structure de la table `scl_saisons`
--
 
DROP TABLE IF EXISTS `scl_saisons`;
CREATE TABLE IF NOT EXISTS `scl_saisons` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `annee` varchar(4) NOT NULL,
  `total_tps_jeu` int(4) NOT NULL DEFAULT '0',
  `total_nbr_entrainements` int(2) NOT NULL DEFAULT '0',
  `total_nbr_matchs` int(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
 
 
--
-- Structure de la table `scl_stats_joueurs`
--
 
DROP TABLE IF EXISTS `scl_stats_joueurs`;
CREATE TABLE IF NOT EXISTS `scl_stats_joueurs` (
  `idscl_membres` int(5) NOT NULL,
  `idscl_saisons` int(2) NOT NULL,
  `tps_jeu` int(4) NOT NULL DEFAULT '0',
  `nbr_entrainements` int(2) NOT NULL DEFAULT '0',
  `buts_marques` int(2) NOT NULL DEFAULT '0',
  `passes_decisives` int(2) NOT NULL DEFAULT '0',
  `cartons_jaunes` int(2) NOT NULL DEFAULT '0',
  `cartons_rouges` int(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`idscl_membres`,`idscl_saisons`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;





II. PARTIE PHP/HTML:

A. REQUETES SQL:

1. Je récupère les informations concernant la saison en cours (logiquement la dernière crééé).

Code PHP :
1
2
3
4
5
6
7
8
9
10
 
<?php
// RECUPERATION INFOS DERNIERE SAISON CREEE
$derniere_saison = mysql_query("SELECT id, annee FROM scl_saisons ORDER BY id DESC LIMIT 0,1 ") or die(mysql_error());
 
$affiche_saison = mysql_fetch_array($derniere_saison);
 
$id_saison_en_cours = $affiche_saison['id'];
$annee_saison_en_cours = $affiche_saison['annee'];
?>

2. Je récupère dans la "Table scl_membres" les informations concernant les membres qui sont "joueurs dans l'équipe" qui ont donc un numéro de licence.

Code PHP :
1
2
3
4
5
6
7
8
9
 
<?php
// RECUPERER NOMS PRENOMS & STATS JOUEURS => ID 
$stats_licencies = mysql_query("SELECT id, nom, prenom, num_licence, idscl_membres, idscl_saisons, nbr_entrainements, tps_jeu, buts_marques, passes_decisives, cartons_jaunes, cartons_rouges FROM scl_membres
LEFT JOIN scl_stats_joueurs ON scl_membres.id = scl_stats_joueurs.idscl_membres
WHERE scl_membres.num_licence != '0' 
AND scl_stats_joueurs.idscl_saisons = $id_saison_en_cours
ORDER BY id") or die(mysql_error());
?>

3. Je compte le nombre de membres qui sont licenciés.

Code PHP :
1
2
3
4
5
 
<?php
// COMPTE DU NOMBRE D'ID DE JOUEURS LICENCIES
$count_joueurs = mysql_num_rows($stats_licencies);
?>

B. FORMULAIRE HTML + INFOS PHP

Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
<form action="#ok" method="post">
 
	<table  width="80%" border="0">	
 
 
		<?php		
 
		// BOUCLE DE DECLARATION DE VARIABLES
		while ($affiche_stats = mysql_fetch_array($stats_licencies))
		{
 
		?>
 
			<tr>
			<td width="5%" align="center"><?php $id_x[]=$affiche_stats['id']; ?><?php echo $affiche_stats['id']; ?></td>
			<td width="35%" align="right"><?php echo $affiche_stats['nom']; ?> <?php echo $affiche_stats['prenom']; ?></td>
			<td width="10%" align="center"><input name="nbr_entrainements[]" type="text" id="nbr_entrainements" value="<?php echo $affiche_stats['nbr_entrainements']; ?>" size="10"></td>
			<td width="10%" align="center"><input name="tps_jeu[]" type="text" id="tps_jeu" value="<?php echo $affiche_stats['tps_jeu']; ?>" size="10"></td>
			<td width="10%" align="center"><input name="buts_marques[]" type="text" id="buts_marques" value="<?php echo $affiche_stats['buts_marques']; ?>" size="5"></td>
			<td width="10%" align="center"><input name="passes_decisives[]" type="text" id="passes_decisives" value="<?php echo $affiche_stats['passes_decisives']; ?>" size="5"></td>
			<td width="10%" align="center"><input name="cartons_jaunes[]" type="text" id="cartons_jaunes" value="<?php echo $affiche_stats['cartons_jaunes']; ?>" size="5"></td>
			<td width="10%" align="center"><input name="cartons_rouges[]" type="text" id="cartons_rouges" value="<?php echo $affiche_stats['cartons_rouges']; ?>" size="5"></td>
			</tr>
 
		<?php
		}		
		?>
 
	</table>
 
	<input type="submit" name="Submit" value="METTRE A JOUR LES STATS">
 
 
</form>

C. TRAITEMENT DU FORMULAIRE EN PHP:

Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
<?php
 
// BOUTON SUBMIT ACTIVE
if(isset($_POST["Submit"]))
 
{
 
	for($x=0;$x<$count_joueurs;$x++)
 
	{
 
	$result_stats = mysql_query("UPDATE scl_stats_joueurs SET 
	tps_jeu = '$tps_jeu[$x]',
	nbr_entrainements = '$nbr_entrainements[$x]', 
	buts_marques = '$buts_marques[$x]',
	passes_decisives = '$passes_decisives[$x]',
	cartons_jaunes = '$cartons_jaunes[$x]',
	cartons_rouges = '$cartons_rouges[$x]'
	WHERE idscl_membres = '$id_x[$x]'
	AND idscl_saisons = '$id_saison_en_cours'");
 
	}
 
	//SI ERREUR => ALERTE
	if (!$result_stats) 
	{
	die('Requête invalide : ' . mysql_error());
	}
 
 
	//SINON MESSAGE SUCCES		
	else
	{
	echo '<div class="reussite">Table scl_stats_joueurs mise à jour avec succ&egrave;s!</div>';
	}
 
//FERMETURE if(isset($_POST["Submit"]))		
}
 
?>


PROBLEME :

l'erreur suivante apparait : Requête invalide : Duplicate entry 'x-x' for key 'PRIMARY'.

Pour quelle(s) raison(s) la mise à jour ne s'effectue pas ? Et me renvoie cette erreur.

Je pense que le problème vient soit :
- de la "Table scl_stats_joueurs" et du fait que sa clé primaire rassemble 2 clés étrangères;
- de la requête SQL de mise à jour.



Merci d'avance aux personnes qui jetterons un oeil sur ce cas.

PS: Vous l'aurez compris je ne suis pas développeur de métier, je me suis formé ci et là et je dois avoir pas mal de lacunes notamment coté SGDB.
Blackcocktail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h20   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Es-tu certain que l'erreur se produise au moment de la partie C du code que tu nous présentes ?
La requête cherche la ligne à mettre à jour en se basant sur les colonnes de la clé primaire mais ne met pas à jour ces colonnes donc il n'y a pas de raison qu'à ce moment là apparaisse une telle erreur.

N'y aurait-il pas plutôt une opération d'insertion quelque part ?

Ajoute à ton die le texte de la requête SQL envoyée au serveur. Par exemple comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
$sql = "UPDATE scl_stats_joueurs SET 
	tps_jeu = '$tps_jeu[$x]',
	nbr_entrainements = '$nbr_entrainements[$x]', 
	buts_marques = '$buts_marques[$x]',
	passes_decisives = '$passes_decisives[$x]',
	cartons_jaunes = '$cartons_jaunes[$x]',
	cartons_rouges = '$cartons_rouges[$x]'
	WHERE idscl_membres = '$id_x[$x]'
	AND idscl_saisons = '$id_saison_en_cours'";
 
mysql_query($sql) or die ('Erreur SQL : '.mysql_error().'<br />Requête : <br />'.$sql);
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h42   #3
Invité de passage
 
Homme
Inscription : novembre 2006
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2006
Messages : 3
Points : 1
Points : 1
Merci Philippe du coup de main.

J'ai effectué ce que tu m'as demandé, cela me renvoie exactement la même erreur, à savoir :

Citation:
Requête invalide : Duplicate entry '8-1' for key 'PRIMARY'

J'ai testé ma requête "pour un joueur" dans PhpMyAdmin en remplaçant les variables par les données directement, et cela fonctionne correctement.
Blackcocktail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 14h54   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Ce que je t'ai conseillé (et pas demandé), c'est d'ajouter le texte de la requête en erreur pour vérifier que l'erreur se produit bien à cette partie du code parce que selon moi la requête que tu incrimines ne peux pas provoquer cette erreur !

L'erreur signifie que le couple (8, 1) qu'une requête essaie d'affecter à la clé primaire, par insertion ou par mise à jour des colonnes constituant la clé primaire, existe déjà dans la table. Or ta requête ne met pas à jour la clé primaire.

Et cet ajout du code exact de la requête envoyée au serveur, il faut le mettre pour toutes les requês de ton code, pas seulement celle-ci qui n'est probablement pas la fautive.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h07   #5
Invité de passage
 
Homme
Inscription : novembre 2006
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2006
Messages : 3
Points : 1
Points : 1
Cependant ton idée d'insertion quelque part m'a mis la puce à l'oreille...

Effectivement j'ai un peu plus haut dans ma page php un autre script (Formulaire) qui permet de créer tous les joueurs pour une nouvelle saison.

Celui-ci contient un "INSERT INTO".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<?php
if(isset($_POST["Submit"]))
{
 
for($i=0;$i<$count;$i++)
 
{
 
$result = mysql_query("INSERT INTO scl_stats_joueurs (idscl_membres, idscl_saisons, tps_jeu, nbr_entrainements,buts_marques, passes_decisives, cartons_jaunes, cartons_rouges) 
VALUES ('$id[$i]','$id_saison','0', '0','0', '0', '0', '0') ");
}
 
 
if (!$result) 
{
die('Requête invalide : ' . mysql_error());
}
 
else
{
echo '<div class="reussite">Table scl_stats_joueurs cr&eacute;&eacute;e avec succ&egrave;s!</div>';
}
 
}
 
 
?>
En supprimant cette partie du code, l'erreur "DUPLICATE ENTRY FOR KEY PRIMARY" disparait.

Cependant la Table est vidée (logique) en m'indiquant clairement des variables non identifiées pour chaque colonne de chaque joueur :

Citation:
Notice: Undefined variable: tps_jeu in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 115

Notice: Undefined variable: nbr_entrainements in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 116

Notice: Undefined variable: buts_marques in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 117

Notice: Undefined variable: passes_decisives in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 118

Notice: Undefined variable: cartons_jaunes in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 119

Notice: Undefined variable: cartons_rouges in D:\wamp\www\SCL v2\liste-saison-joueurs.php on line 120
En tout cas ça avance je pense que je suis proche de la soluce. Me manque plus qu'à identifier ces variables...

Mais ceci est un autre sujet.

Merci.
Blackcocktail est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h10.


 
 
 
 
Partenaires

Hébergement Web