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 :

Tester la gestion des erreurs


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut Tester la gestion des erreurs
    Bonsoir, vu que PDO crée une exception en cas d'erreur, je pensais qu'envoyant plusieurs fois la même requête de création de la même table, j'aurais une exception et apparemment non. Peut-on me dire pourquoi ?

    testforumpoo.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php 
    include 'MyClassLogin.php';
     
    try{
    $login=new login();
    $login->test_connexion();
    }catch(PDOException $e){
    	echo "argggggggggggggg".$e->getMessage();
    }
    ?>
    MyClassLogin.php :
    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
    <?php
    session_start();
    class login extends PDO {
       public $id_login;
       public $login;
       public $pwd;
       public $connecte;
       public $mail;
       public $notif;
     
       static public $DB_NAME = "---";
       static public $HOST = "---";
       static public $USER = "---";
       static public $PASS = "---";
     
    // le constructeur de login appelle le constructeur de PDO en lui passant ses paramètres	
    function __construct() {
    parent::__construct('mysql:host=' .login::$HOST . ';dbname=' . login::$DB_NAME, login::$USER, login::$PASS);
    }
     
       public function test_connexion() {
       $sql="CREATE TABLE espion (id_espion MEDIUMINT UNSIGNED AUTO_INCREMENT, espion VARCHAR(30) NOT NULL,PRIMARY KEY(id_espion));";
     
     
    	try{
     $this->query($sql, PDO::FETCH_OBJ);
     echo "envoi requete<br>";
     
    }catch(PDOException $e){
    	echo "argggggggggggggg".$e->getMessage();
    }
       }

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Es tu sur d'avoir bien cerné(e) la gestion des erreurs, avec try et catch, et de même comment construire une classe abstraite pour les requêtes sur la bdd?

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    A vrai dire, ni l'un ni l'autre, sachant que je viens de suivre une formation (fort intéressante) sur la POO en PHP, et que j'y ai notamment découvert le try/catch. J'ai donc cherché à m'inspirer d'un code qui marche pour créer le mien. Mais si ce que j'ai fait n'est pas bon, tout éclaircissement serait bienvenu.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Class mysqlPdo

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <?php
    class bdd extends PDO 
    {
    final public function __construct($dsn, $username = '', $password = '', $driverOptions = array())
        {
            $driverOptions += array(self::ATTR_ERRMODE => self::ERRMODE_EXCEPTION,
    	self::ATTR_STATEMENT_CLASS => array('Statement'),PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8' ");
            parent::__construct($dsn, $username, $password, $driverOptions);
        }
    }
    class Statement extends PDOStatement 
    {
     
    } 
     
    abstract class _mysqlPdo
    {
     
        public function result($array)
        {
            return $array;
        }
     
        protected  function connect()
        {
            try {
            $dbh = new bdd('mysql:host=localhost;dbname=mabasededonne', 'root','');
    	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch (PDOException $e) {
            throw new Exception("Error occured while saving your object", null, $e);
            }
            return $dbh;
        }
     
        private function _bindParam($sth,$array){
     
        }   
        private function _prepare(){
     
        }
        private function _execute(){
     
        }
        protected  function _query($query,$array )
        {
     
            $id=0;
            $dbh = $this->connect();
            if($query==='' || ( isset($this->curentQuery) && $query===$this->curentQuery) ){
                $sth = $this->curentQuery;
            }else{
                $sth = $dbh->prepare($query);
                $this->curentQuery = $sth;
            }
    	    if(!empty($array)){
    		foreach($array as $key =>$v ){
    		$sth->bindValue( ':'.$key ,$v);
    		}		
    	    }
             try {  
     
    		  $sth->execute();
    			 if(substr_count($sth->queryString,'SELECT')>0 && substr_count($sth->queryString,'INSERT')==0 )
    			 {
    			 return $this->result($sth->fetchAll(PDO::FETCH_CLASS,'mysqlPdo'));
    			 }
    			 else{
    			 return $dbh;
    			 }
    		  }
    	   catch (PDOException $e) {
    	   JUSC_Exception::message( $e->getMessage());		
    	   }  
     
        }
     
        abstract public function query($query,$array );
     
        }
     
        class mysqlPdo extends _mysqlPdo
        {
     
    	   public function query($query,$array )
    	   {
    	    return $this->_query($query,$array );
    	   }
     
        }
     
     
     
    ?>

    requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $bdd = new mysqlPdo;
    $uniqueID = 'S101';
    $table_name = 'user';
     $index   =  $bdd->query("SELECT nom,prenom,adresse,ville,cp,email FROM $table_name WHERE uniqueId = :uniqueID" , array('uniqueID'=>$uniqueID )) ;
    ;
    print_r($index);

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Pour que PDO lance des Exceptions en cas d'erreurs pour pouvoir ensuite les attraper avec des try/catch il faut le définir parmi les options.
    Par défaut c'est en mode "silence" (PDO::ERRMODE_SILENT).

    La doc de Php : PDO : Les erreurs et leur gestion

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    );
    $dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', 'pass', $options);
    Après, libre à chacun de créer une abstraction ou pas (il n'y a pas obligation).

    sachant que je viens de suivre une formation (fort intéressante) sur la POO en PHP, et que j'y ai notamment découvert le try/catch
    Dans cette formation, on ne t'a pas dit qu'il y a une doc en ligne (hormis les moteurs de recherche) ?

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Dans cette formation, on ne t'a pas dit qu'il y a une doc en ligne (hormis les moteurs de recherche) ?
    Non, sachant qu'elle portait surtout sur la POO et que PDO n'a été juste que survolé (et encore sur ma demande, car ce n'était pas au programme) ; mais vos réponses semblent très complètes ; je prendrai le temps de les étudier et reviendrai ici pour en rendre compte. Déjà, merci.

Discussions similaires

  1. [FB] Gestion des erreurs et application francophone
    Par Benjamin GAGNEUX dans le forum Installation
    Réponses: 10
    Dernier message: 20/05/2006, 14h54
  2. [struts][Datasource]Gestion des erreurs
    Par GreenJay dans le forum Struts 1
    Réponses: 8
    Dernier message: 15/09/2004, 16h51
  3. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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