ERROR Duplicate entry '2' for key 'PRIMARY''

Fermé
Etudiante - Modifié par Etudiante le 21/05/2014 à 10:08
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 21 mai 2014 à 11:39
Bonjour,

Cela fait maintenant 2 jours que je bloque sur ce problème; Je souhaite pouvoir ajouté différent contenu à différent sujet. J'ai donc effectuer le code suivant dans deux pages différentes.
Quand il n'y a rien dans la base de donnée il fonctionne. Le premier contenu rentre, le deuxième aussi MAIS quand on veux rajouter un troisième contenu voici l'erreur affiché :
" Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY'' in ...\class.pdogsb.inc.php on line 203
( ! ) PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY' in ...\class.pdogsb.inc.php on line 203"

En ayant regardé sur plusieurs forum j'ai remarqué qu'il fallait auto-incrémenté la clé primaire, je l'ai fait mais toujours le même problème....

Si vous pouviez m'aider, merci d'avance :)




case 'ajouterContenu':{
$autre='<form method=post ACTION="index.php?uc=admin&action=contenuAjoute">';
$listeDeroulante=$pdo->getSujetPage();
$autre.=$listeDeroulante;
include("vues/admin/v_ajouter.php");
break;
}




case 'contenuAjoute':{
$text=$_POST['text'];
$codeSujet=$_POST['sujet'];
$textPage=$pdo->ajoutContenu($codeSujet,$text);
include("vues/admin/v_accueilAdmin.php");
break;
}




public function ajoutContenu($codeSujet,$textPage){
$req = "SELECT 'code' as code
FROM 'contenu'";
$res = PdoGsb::$monPdo->query($req);
$laLigne = $res->fetch();
$codeContenu=$laLigne['code']+1;
$req="INSERT INTO 'borg'.'contenu' ('code', 'code_sujet', 'text_contenu') VALUES ('".$codeContenu."', '".$codeSujet."', '".$textPage."');";
$res = PdoGsb::$monPdo->query($req);
return "Nouveau contenu ajouté";
}

1 réponse

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 21/05/2014 à 11:40
Salut,

Ta requête SELECT 'code' as code FROM 'contenu' te retourne tous les codes de la table contenu, donc si tu as 2 contenus, tu obtiens la liste suivante :
1
2

Puisque tu ne fait qu'un seul fetch, tu récupère la premier code de la liste précédente, soit 1, auquel tu ajoutes 1, soit la valeur 2. Or le contenu avec le code 2 existe déjà.
Pour corriger cela, il faudrait modifier ta requête select pour récupérer le dernier code ajouté, par exemple :
SELECT 'code' as code FROM 'contenu' ORDER BY code DESC
Avec cette requête on tri les résultats dans l'ordre décroissant, nous obtenons donc la liste suivante :
2
1

Le reste du code fonctionnera donc correctement. D'ailleurs puisque nous voulons récupérer uniquement le dernier code ajouté, nous pouvons limiter le résultat de notre requête select à un seul résultat :
SELECT 'code' as code FROM 'contenu' ORDER BY code DESC LIMIT 1

Mais...
Si dans ta base de données tu as bien défini le champ code en tant que auto_increment, celui va automatiquement s'incrémenter à chaque requête insert, tu n'as donc pas besoin de le préciser dans ces requêtes :
$req="INSERT INTO 'borg'.'contenu' ('code_sujet', 'text_contenu') VALUES ('".$codeSujet."', '".$textPage."');";

Ainsi tu n'as pas besoin de faire de requête select pour récupérer le dernier code utilisé.

Bonne journée
1