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 :

Compter le nombre de requête SQL [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Points : 47
    Points
    47
    Par défaut Compter le nombre de requête SQL
    Bonjour à tous !

    J'utilise pour mon site la PDO [voir doc] pour gérer ma database.

    Je voudrais faire une class extendu de PDO (et PDOStatement qui fonctionne avec) afin de leurs ajouter deux compteurs :

    - Un compteur de requêtes par page (surement un attribue de PDO).
    - Un compteur de requêtes total (surement stocker dans un fichier).

    Sachant que 3 méthode permettent de faire des requêtes en BDD il faut que chacun appelle une méthode perso 'increment' :
    - Query (PDO)
    - Exec (PDO)
    - Execute (PDOStatement)


    J'ai donc commencer mes deux classes : myPDO et myPDOStatement (escusez moi pour la taille du code mais il y à pas moyen de mettre en secret)

    myPDO
    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
    <?php
    	class myPDO extends PDO // On hérite de PDO
    	{
    		protected $count; 
     
    		// GETTER
     
    		public function count() { return ($this->count) ? $this->count : 0; }
     
     
    		// FUNCTION
     
    		public function increment()
    		{
     
    			$this->count = ($this->count()) ? $this->count()+1 : 1;
     
    			// To do : incrementer le fichier 
     
    		}
     
     
     
    		// SURCHARGE 
     
     
    		function __construct($dsn, $username="", $password="", $driver_options=array()) 
    		{
    		    parent::__construct($dsn,$username,$password, $driver_options);
    		    $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('myPDOStatement', array($this)));
    		}
     
    		public function query($query)
    		{
    			$this->increment();
    			return parent::query($query);
    		}
     
    		public function exec($query)
    		{
    			$this->increment();
    			return parent::exec($query);
    		}
     
    	}
    ?>
    myPDOStatement
    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
    <?php
     
    class myPDOStatement extends PDOStatement {
     
    	public $myStatement;
     
    	public $count;
     
     
    	// GETTER
    	public function count() { return ($this->count) ? $this->count : 0; }
     
     
    	// FUNCTION
     
    	public function increment()
    	{
    		$this->count = ($this->count()) ? $this->count()+1 : 1;
    	}
     
     
    	// SURCHARGE
     
        protected function __construct($dbh) 
        {
            $this->myStatement = $dbh;
        }
     
     
    	public function execute($input = array ())
    	{
    		$this->increment();
    		return parent::execute($input);
    	}
     
    }
     
    ?>

    Le problème est que je me retrouve avec 2 compteurs... Et je n'arrive pas à trouver comment appelé la méthode myPDO::increment depuis myPDOStatement...

    Quelqu'un aurait une solution ??

    Merci à tous !
    KreatoO

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Tu peux garder une référence de la connexion PDO dans ton objet statement :

    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
     
    class myPDOStatement extends PDOStatement {
     
        protected function __construct($dbh, myPDO $pdo) 
        {
            $this->myStatement = $dbh;
            $this->_pdo            = $pdo;
        }
     
     
    	public function execute($input = array ())
    	{
    		$this->_pdo->increment();
    		return parent::execute($input);
    	}
     
    ...
    }
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Membre du Club Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Points : 47
    Points
    47
    Par défaut
    J'ai déjà essayer et en faisant ça plus rien ne fonctionne (aucune requête 'execute' ne fonctionne)...
    KreatoO

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tu peux utiliser une astuce pas très propre en t'appuyant sur la superglobale $_ENV par exemple (je propose celle ci parce qu'elle n'a à priori aucune incidence sur quelque niveau de script)

    Sinon un peu plus propre, définir une classe d'appui statique (si quelqu'un a un meilleur terme à proposer... ) du style (très simplifié, pour illustrer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MonCompteurARequetesPDO{
         public static $compte = 0;
    }
    et à l'usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function query($query)
    		{
    			MonCompteurARequetesPDO::$compte++;
    			return parent::query($query);
    		}
    Pourfendeur de singletons en croisade

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Tu peux utiliser une astuce pas très propre en t'appuyant sur la superglobale $_ENV par exemple (je propose celle ci parce qu'elle n'a à priori aucune incidence sur quelque niveau de script)

    Sinon un peu plus propre, définir une classe d'appui statique (si quelqu'un a un meilleur terme à proposer... ) du style (très simplifié, pour illustrer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MonCompteurARequetesPDO{
         public static $compte = 0;
    }
    et à l'usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function query($query)
    		{
    			MonCompteurARequetesPDO::$compte++;
    			return parent::query($query);
    		}
    Je trouve personnellement tout cela moins propre que la référence à l'objet myPDO.
    En théorie, cela doit marcher, mon code nécessite sûrement une adaptation, mais il était surtout donné pour le principe.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tu as entièrement raison. Les méthodes que j'ai proposé ne sont que des bidouilles vu qu'apparemment passer une vue sur l'instance de MyPDO ne fonctionnait pas.
    Reste à savoir comment le traitement sur cette vue a été implémenté, parce qu'il n'y a à priori aucune raison que ça foire.
    Pourfendeur de singletons en croisade

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Voilà un truc que j'ai testé rapidement et qui semble fonctionner comme demandé :

    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
    class myPDO extends PDO {
     
    	protected $_count = 0; 
     
    	public function count()     { return $this->_count; }
     
    	public function increment() { $this->_count ++; }
     
    	function __construct($dsn, $username="", $password="", $driver_options=array()) {
    		parent::__construct($dsn,$username,$password, $driver_options);
    		$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('myPDOStatement', array($this)));
    	}
     
    	public function query($query) {
    		$this->increment();
    		return parent::query($query);
    	}
     
    	public function exec($query) {
    		$this->increment();
    		return parent::exec($query);
    	}
     
    }
     
     
    class myPDOStatement extends PDOStatement {
     
        protected $_pdo;
     
        public function count() { return $this->_pdo->count(); }
     
     
        protected function __construct($pdo) {
            $this->_pdo = $pdo;
        }
     
     
        public function execute($input = array ()) {
            $this->_pdo->increment();
            return parent::execute($input);
        }
     
    }
     
     
    $pdo = new myPDO($dsn, $user, $pwd);
     
    $sth = $pdo->prepare("SELECT * FROM table");
    $sth->execute();
    $rows = $sth->fetchAll();
     
    $sth = $pdo->prepare("SELECT * FROM table");
    $sth->execute();
    $rows = $sth->fetchAll();
     
    Zend_Debug::dump($pdo);
    Zend_Debug::dump($sth);
    Zend_Debug::dump($rows);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre du Club Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Points : 47
    Points
    47
    Par défaut
    Hoow ! Merci s.n.a.f.u !!

    C'est exactement ça ! Et j'ai en même temps pus comprendre ou je bloquais !

    En faite j'essayais moi même de créer un objet myPDOStatement dans la méthode prépare() de myPDO et ensuite de l'utiliser, mais je n'avais pas vu que le setAttribue permet aussi d'envoyer $this !

    Merci beaucoup !

    [Sujet Résolu]
    KreatoO

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

Discussions similaires

  1. [Script] Nombre de requêtes SQl supérieur à 600s
    Par malik0 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 24/02/2012, 13h42
  2. Compter le nombre de lign sql
    Par thebarbarius dans le forum Langage
    Réponses: 3
    Dernier message: 13/01/2012, 20h25
  3. compter le nombre de requêtes sur une bdd
    Par sp2308 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/01/2011, 23h25
  4. [PDO] Compter le nombre de requêtes effectuées
    Par Zamer dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/02/2008, 23h02
  5. Réponses: 4
    Dernier message: 14/11/2006, 19h03

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