IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

UPDATE: ERROR DUPLICATE ENTRY FOR KEY PRIMARY [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci Philippe du coup de main.

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

    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.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ERROR : Duplicate entry '' for key 2
    Par Estragon007 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/07/2013, 21h26
  2. Duplicate entry for key
    Par Arget dans le forum Développement Web en Java
    Réponses: 20
    Dernier message: 09/12/2011, 13h42
  3. Réponses: 3
    Dernier message: 02/06/2011, 16h47
  4. Réponses: 7
    Dernier message: 29/11/2010, 17h34
  5. duplicate entry for key 'primary'
    Par mariek dans le forum Requêtes
    Réponses: 4
    Dernier message: 12/09/2009, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo