Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire apparaitre un message d'erreur

    19 juillet 2010 à 15:03:10

    Bonjour,
    petit problème tout simple à mon avis. Je fais des tests sur la base que je suis en train de créer. Je passe par un petit code php :

    <?php
    // Connexion à la base de données
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=ebom_data_base', 'root', '');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
    
    
    //Insertion des données
    
    $req = $bdd->query('INSERT INTO tbl_offers (`Offer Number`, Region, `Customer Unit`, Cluster, Customer, Country) VALUES(\'EAB451\', \'EMEA\', \'MEA\', \'ME\', \'SFR\', \'Egypte\')') or die(print_r($bdd->errorInfo()));
    
    ?>
    


    Bon bah la pas de soucys, si j'exécute 2 fois ce script, il me met bien duplicated Key (enfin bien qu'il me mette quelque chose de bizarre avant :
    Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry 'EAB451' for key 'PRIMARY' ) 1
    Pourquoi il ne me met pas juste : Duplicate entry 'EAB451' for key 'PRIMARY' )

    Enfin ça c'est pas très grave, le plus important c'est que si je modifie mon code tel que :

    <?php
    $req = $bdd->prepare('INSERT INTO tbl_offers (`Offer Number`, Region, `Customer Unit`, Cluster, Customer, Country) VALUES(?, ?, ?, ?, ?, ?)') or die(print_r($bdd->errorInfo()));
    $req->execute(array('EAB451', 'EMEA', 'MEA', 'ME', 'SFR', 'Egypte'));
    ?>
    


    Même si je l'éxécute 2 fois d'affiler il ne m'affiche aucun message d'erreur. Ok il n'implémente pas la base, pas de problème de ce côté là, mais j'ai vraiment besoin qu'il affiche ce message de duplicated key pour l'utilisateur...

    Je précise que je passe par la forme prepare-execute, car à la place des paramètres, je vais mettre des variables issues d'un fichier excel. La c'est juste pour tester les affichage des erreurs.

    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2010 à 16:11:22

      Salut,

      en premier, il y a des balise pour mettre en couleur le code php que tu veut insérer dans ton message, c'est le petit symbole en haut "</>"

      Pour répondre a ta question, il t'affiche : "Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry 'EAB451' for key 'PRIMARY' ) 1 "
      Tout simplement parce que print_r renvoie toutes les données du tableau mis en paramètre c'est a dire ici errorInfo, c'est a dire toutes les informations stocké dans errorInfo.

      Pour ta seconde question, tu n'as plus d'erreur car tu ne lui demande plus de l'afficher, en effet,

      <?php
      $req = $bdd->prepare('INSERT INTO tbl_offers (`Offer Number`, Region, `Customer Unit`, Cluster, Customer, Country) 
      VALUES(?, ?, ?, ?, ?, ?)') 
      or die(print_r($bdd->errorInfo()));
      ?>
      


      dans ce code tu lui demande d'afficher les erreur du a la préparation de la requête, il n'y a généralement pas d'erreur a la préparation, php se rend compte des erreurs a l'exécution.
      il faut donc bien que tu laisse ton code comme le premier que tu nous a montré !

      Pour ce qui de ton erreur, l'erreur indiqué : Duplicate entry 'EAB451' for key 'PRIMARY' veut tout dire. Cela signifie que tu as deux fois la même entrée dans ta base de données, ou traduis en langage français, cela veut dire que tu tente sans doute d'entrée des données avec le même id qu'une autre entrée déjà présente.

      Cela vient de 'EAB451', que tu as mis comme id, tu devrais l'enlevé, et soit utiliser une table auto incrémente, tu n'auras alors plus cette erreur, ou bien modifier ton id, en vérifiant qu'il n'existe aps dans ta bdd.

      Bonne chance pour la suite

      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2010 à 16:23:21

        Merci pour l'astuce des couleurs sur le forum ;)
        Hmm je comprends le fait qu'on test la préparation et non l'éxécution. Cependant n'y a t'il pas une solution pour garder cette forme là, car comme je le spécifie, je vais avoir besoin des requêtes "préparés". Car à la place des exemples que j'ai rentrés : 'EAB451', 'EMEA', 'MEA', 'ME', 'SFR', 'Egypte'
        j'aurais des variables qui vont dépendre d'un tableau excel, et il n'est pas très sécurisé d'insérer les variables directement dans $bdd->query(.....) je crois. C'est bien pour cela que je suis passé par les requêtes "préparés" (prepare-execute)
        Pour l'erreur, je suis bien au courant de ce qu'elle veut dire puisque je la provoque volontairement pour tester les messages d'erreurs affichés ;)
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2010 à 21:04:34

          Re,

          Tu peux tout a fait préparé tes requêtes et ensuite les exécuté, et a ce moment la seulement vérifier les erreurs.
          Je vais pas détailler, réfère toi au tuto de mateo ici

          bonne chance ;)
          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2010 à 9:52:42

            Si vous utilisez une requête préparée, rajoutez le code qui affiche l'erreur sur la même ligne que le prepare() :

            <?php
            $req = $bdd->prepare('SELECT nom, prix FROM jeux_video WHERE possesseur = :possesseur') or die(print_r($bdd->errorInfo()));
            ?>
            

            Mais euh si tu regarde mon exemple c'est exactement ce que j'ai fait, et pourtant avec les requêtes préparés, l'erreur ne s'affiche pas :(
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2010 à 13:56:04

              Oui mais comme je l'ai indiqué, en préparant ta requête tu n'as pas fait d'erreur, donc l'erreur ne s'affiche pas !
              c'est pour ca que tes erreurs ne s'affichent que a l'execution
              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2010 à 15:22:56

                Je dois être complètement neuhneuh, mais tu pourrais explicitement me dire ou je dois placer le
                or die(print_r($bdd->errorInfo()));
                dans mon exemple du haut? Car j'arrive vmt rien à afficher, en le placant n'importe ou au niveau de l'execution et non de la préparation...
                • Partager sur Facebook
                • Partager sur Twitter
                  21 juillet 2010 à 15:35:22

                  L'erreur tu l'affiches lors de l'exécution de la requête.
                  <?php
                  $req = $bdd->prepare('SELECT nom, prix FROM jeux_video WHERE possesseur = :possesseur') or die(print_r($bdd->errorInfo()));
                  $req->execute(array('possesseur' => $tavariable)) or die(print_r($bdd->errorInfo()));
                  ?>
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 juillet 2010 à 17:05:08

                    Plutôt que de se faire chier avec des or die() partout, active les exceptions de PDO dans le constructeur...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juillet 2010 à 9:43:04

                      Dernière petite question, comment active-t-on ces exceptions PDO?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 juillet 2010 à 12:20:09

                        Merci bien :) Mais comme je galère là dessus depuis quelques jours, je voulais la réponse d'un expert ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 juillet 2010 à 13:31:26

                          Je trouve que c'est idiot que les exceptions ne soient pas activées par défaut.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Faire apparaitre un message d'erreur

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown