ERROR duplicado de entrada '2' para la clave PRIMARY

Etudiante -  
Pitet Mensajes publicados 2845 Estado Miembro -
Hola,

Ya llevo 2 días bloqueado con este problema; quiero poder añadir contenidos diferentes a diferentes temas. Por ello he realizado el código siguiente en dos páginas distintas.
Cuando no hay nada en la base de datos funciona. El primer contenido entra, el segundo también PERO cuando se quiere añadir un tercer contenido aparece este error:
"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"

Habiéndolo visto en varios foros he visto que hacía falta auto-incrementar la clave primaria, lo hice pero sigue el mismo problema....

Si me pudieras ayudar, gracias de antemano :)

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 respuesta

  1. Pitet Mensajes publicados 2845 Estado Miembro 530
     
    Hola,

    Tu consulta SELECT 'code' as code FROM 'contenu' te devuelve todos los códigos de la tabla contenu, así que si tienes 2 contenidos, obtienes la lista siguiente:
    1
    2

    Ya que solo haces un único fetch, recuperas el primer código de la lista anterior, es decir 1, al que le añades 1, obteniendo así el valor 2. Pero el contenido con el código 2 ya existe.
    Para corregirlo, habría que modificar tu consulta select para recuperar el último código añadido, por ejemplo:
    SELECT 'code' as code FROM 'contenu' ORDER BY code DESC
    Con esta consulta ordenamos los resultados en orden descendente, por lo que obtenemos la lista siguiente:
    2
    1

    El resto del código funcionará correctamente. Por cierto, ya que queremos recuperar únicamente el último código añadido, podemos limitar el resultado de nuestra consulta select a un único resultado:
    SELECT 'code' as code FROM 'contenu' ORDER BY code DESC LIMIT 1

    Pero...
    Si en tu base de datos has definido correctamente el campo code como auto_increment, éste se irá incrementando automáticamente con cada sentencia insert, por lo que no necesitas especificarlo en estas consultas:
    $req="INSERT INTO 'borg'.'contenu' ('code_sujet', 'text_contenu') VALUES ('".$codeSujet."', '".$textPage."');";

    Así no necesitas hacer una consulta select para recuperar el último código utilizado.

    Que tengas un buen día
    1