Insertion et modification d'un tuple

Bonjour,

Je suis en plein devoir PHP

On me demande d'insérer une note dans une base (appelons là "etudiants"), ça fonctionne très bien, voici le code que je tape :
//Insertion d'une nouvelle note étudiant
$reponse = $bd->exec('INSERT INTO notes (Note, IdEtudiant, IdUE)
VALUES(\'12\',\'30001459\',\'1008\')');
echo "insertion réussie";


L'autre question c'est la modification d'une note, et là le localhost ne veut rien savoir ...
Je tape ça :
//Correction de la note d'un étudiant
$reponse = $bd->exec('UPDATE notes
SET Note=\'19\', IdEtudiant=\'35010192\', IdUE=\'1008\'');
echo "modification réussie";


Il me répond ça ... :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '30001459-1008' for key 'PRIMARY'' in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\connexion.php:44 Stack trace: #0 C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\connexion.php(44): PDO->exec('INSERT INTO not...') #1 {main} thrown in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\my portable files\connexion.php on line 44

Merci de vos réponses, je désespère :'(

6 réponses

  1. Bonjour,
    Il semblerait que tu passes plusieurs fois dans ton code qui fait l'insert.

    Duplicate entry '30001459-1008' for key 'PRIMARY'' indique que tes clés primaires IdEtudiant-IdUE existent déjà dans la BDD, donc l'insert te sort l'erreur car tu as déjà une ligne avec IdEtudiant=30001459 et avec IdUE = 1008.

    Rajoute une condition pour faire ton insert qu'une seule fois.
    0
    1. Je vais paraître complètement à l'ouest mais je ne sais pas comment faire!
      0
      1. Encore mieux: au lieu du insert utilises REPLACE, si la ligne n'existe pas elle est créée et si elle existe elle est mise à jour :
        REPLACE INTO notes
        SET Note= ‘12′,
        IdEtudiant = '30001459',
        IdUE = '1008'


        ça devrait lever ton erreur. Sinon, joints ton code en utilisant la balise code associée.
        0
        1. Merci mille fois de tes réponses !

          Le soucis c'est que je dois clairement distinguer l'insertion de la modification dans mon devoir
          0
          1. dans ce cas quand tu fais l'insert, récupère l'id créé :
            $last_id = $bd->lastInsertId();


            et avant de faire le insert tu rajoutes :
            if(!$last_id){
            //code insert
            }else{
            //code update
            }


            mais pour cela il faut que tu ais un champ AUTO_INCREMENT comme clé primaire.
            0
            1. Je vais essayer tout ça !

              Merci bcp :)
              0