ERROR Duplicate entry '2' for key 'PRIMARY'' [Fermé]

Signaler
-
Messages postés
2371
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
13 janvier 2021
-
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

Messages postés
2371
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
13 janvier 2021
440
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci