IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Exceptions [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 106
    Par défaut Exceptions
    bonjour!

    voici un bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            ...
            try{
    	$query="SELECT * FROM fee.member_list WHERE nick=:chaine limit 1;";
    	$result=$dbf->prepare($query);
    	$result_tag=$result->execute(array(':chaine'=>addslashes($string)));
    	if (!$result_tag)
    	throw new BDDexception(2);
    	...	
    	}
    	catch(BDDexception $e){
    	$e->showpage();
    	}
    Le but de mon code est d'attrapé une exception si la requete SQL n'est pas éxécutée.
    si je met un "a" avant le SELECT pour provoquer une erreur voici ce que je recoit de PHP comme message d'erreur :

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'aSELECT * FROM fee.member_list WHERE nick='c' limit 1' at line 1' in D:\serveur_local\wamp\www\fee\php\verif_inscrip_index_excep.php:37 Stack trace: #0 D:\serveur_local\wamp\www\fee\php\verif_inscrip_index_excep.php(37): PDOStatement->execute(Array) #1 {main} thrown in D:\serveur_local\wamp\www\fee\php\verif_inscrip_index_excep.php on line 37

    J'ai remarqué aussi que si je rajoute un autre catch comme celui la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    catch(exception $e){
    	}
    Ca a l'air de fonctionné sans que je fasse un test sur la requete et ca utilise la classe exception alors que je veux utiliser la classe "BDDexception"

    Je ne comprend pas et ne maitrise pas ce comportement de l'exception.

    Pouvez vous m'éclairer SVP ?

    merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Avec une gestion d'erreur par exception, PDO lève lui-même les exceptions. Elles seront de type PDOException, ce n'est pas négociable. Si vous souhaitez vraiment en lever une d'une autre classe, il faudrait retourner dans un mode d'erreur classique, tester les valeurs de retour, et lever ou non votre propre exception sinon, éventuellement [suivant les cas], attraper les PDOException pour lever la votre. C'est certainement lourd pour pas grand chose.

    Quant au fait qu'il y a interception avec un catch sur Exception, c'est normal, puisque c'est la - une en fait - classe parente de ces exceptions (PDOException et la votre - c'est de la POO, au besoin : les exceptions en PHP 5).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 106
    Par défaut ok...
    Donc je ne peux pas "forcer" la levée d'une exception sur une classe dérivée de la classe PDOexception c'est bien ca??

    Du coup pour gérer les éventuelles "exception" il est préférable de le faire via la gestion par erreur "classique" par test des valeurs de retour?

    Ai je bien compris?

    Pourquoi le message d'erreur sinon?

    Merci a vous!


  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par salsabouge Voir le message
    Donc je ne peux pas "forcer" la levée d'une exception sur une classe dérivée de la classe PDOexception c'est bien ca??
    Si mais indirectement, dérivée ou non d'ailleurs. C'était le sens de ma précédente réponse.

    Citation Envoyé par salsabouge Voir le message
    Du coup pour gérer les éventuelles "exception" il est préférable de le faire via la gestion par erreur "classique" par test des valeurs de retour?
    Si par exception est sous-entendu erreur liée à PDO donc au SGBD, non. Personnellement, je préfère les exceptions (PDOException) c'est beaucoup moins lourd/répétitif de gérer de manière commune les erreurs du SGBD par un bloc catch que de s'amuser à tester chaque valeur retournée pour ensuite la gérer, même avec une fonction. Après, tout dépend des besoins de chacun, de son but et de ses goûts. Cela dit, j'ai déjà vu un cas d'erreur (bien que non critique) où aucune exception n'était levée et la valeur retournée était fausse (pilote MySQL sur un champ BLOB de taille insuffisante).

    Par ailleurs, ne pas oublier que le constructeur [PDO], lève, en cas d'erreur, quoiqu'il arrive une PDOException.

    Citation Envoyé par salsabouge Voir le message
    Pourquoi le message d'erreur sinon?
    C'est le comportement par défaut de PHP et ce qui se produit quand une exception n'est pas gérée/attrapée.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 106
    Par défaut je comprends pas tout...
    Comment faire alors pour que lorsque j'ai un problème de requête comme cité dans mon premier message pour que l'exception attrapée soit BDDexception et non PDOexception?

    Merci.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Si c'est ce que vous voulez :
    • intercepter l'exception PDOException pour en lever une autre :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      <?php
      class BDDException extends /*PDO*/Exception {}
       
      class MyPDO extends PDO {
          public function __construct() {
              try {
                  call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args());
              } catch (PDOException $e) {
                  throw new BDDException($e->getMessage(), $e->getCode()/*, $e*/);
              }
              parent::setAttribute(self::ATTR_ERRMODE, self::ERRMODE_EXCEPTION);
          }
       
          public function setAttribute($attribute, $value) {
              if ($attribute == self::ATTR_ERRMODE) {
                  throw new Exception("Modification interdite de l'attribut ATTR_ERRMODE");
              }
              return call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args());
          }
       
          public function query($statement) {
              try {
                  return call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args());
              } catch (PDOException $e) {
                  throw new BDDException($e->getMessage(), $e->getCode()/*, $e*/);
              }
          }
      }
       
      try {
          $dbh = new MyPDO(DSN, LOGIN, MOT_DE_PASSE);
          $dbh->query('une requête invalide');
      } catch (/*BDD*/Exception $e) {
          die(sprintf("%s dans %s à la ligne %d : %s", get_class($e), $e->getFile(), $e->getLine(), $e->getMessage()));
      }
      À vraiment éviter puisque ça dénature de manière plus ou moins conséquente l'exception d'origine : ça pourrait aller jusqu'à fausser les débogages (exceptions antérieures non conservées notamment - c'est le cas ci-dessus).
    • conserver une gestion par erreur, et suivant la valeur retournée par la méthode, on lève sa propre exception :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      <?php
      class BDDException extends /*PDO*/Exception {}
       
      class MyPDOBis extends PDO {
          public function __construct() {
              try {
                  call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args());
              } catch (PDOException $e) {
                  throw new BDDException($e->getMessage(), $e->getCode()/*, $e*/);
              }
              //parent::setAttribute(self::ATTR_ERRMODE, self::ERRMODE_SILENT); // c'est le mode par défaut
          }
       
          public function setAttribute($attribute, $value) {
              if ($attribute == self::ATTR_ERRMODE) {
                  throw new Exception("Modification interdite de l'attribut ATTR_ERRMODE");
              }
              return call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args());
          }
       
          public function query($statement) {
              if (!$ret = call_user_func_array(array(get_parent_class(), __FUNCTION__), func_get_args())) {
                  list(, , $msg) = $this->errorInfo();
                  throw new BDDException($msg);
              }
              return $ret;
          }
      }
       
      try {
          $dbh = new MyPDOBis(DSN, LOGIN, MOT_DE_PASSE);
          $dbh->query('une requête invalide');
      } catch (/*BDD*/Exception $e) {
          die(sprintf("%s dans %s à la ligne %d : %s", get_class($e), $e->getFile(), $e->getLine(), $e->getMessage()));
      }

    (c'est purement illustratif)

    Pourquoi ce besoin ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  2. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo