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 :

Affichage d'une requête préparée


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Affichage d'une requête préparée
    Bonjour,

    est-il possible d'afficher/récupérer le contenu de la requête préparée avec les valeurs et non pas les marqueurs ?

    Exemple :
    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
    $sql = "
    UPDATE t_membre
    SET civilite=:civilite, nom=:nom, prenom=:prenom 
    WHERE id=:id
    LIMIT 1;
    ";
    $sth = $cnxPDO->prepare($sql);
     
    for ($i=0; $i<=nbMembres; $i++) {}
        $civilite = $aCivilites[$i];
        $nom = $aNoms[$i];
        $prenom = $aPrenoms[$i];
     
        $sth->bindParam(':civilite', $civilite, PDO::PARAM_STR);
        $sth->bindParam(':nom', $nom, PDO::PARAM_STR, 30);
        $sth->bindParam(':prenom', $prenom, PDO::PARAM_STR, 30);
     
        // echo "<p>Requête SQL : ".$sql."</p>";
     
        $sth->execute();
    }
    Merci d'avance.
    @ bientot

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    pour cela il faut etendre pdostatement.

    J'avais fait une ébauche à corriger / améliorer && nettoyer, juste suffisante.

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    <?
    class PDOPlusStatement extends PDOStatement
    {
    	public $dbh;
     
    	protected $p_params;
     
    	public static $sql;
    	public static $requetes;
    	public static $cache_est_actif = false;				// active l'historique des objets statments;
    	public static $cache_requete_est_actif = false;		// active l'historique des requetes;
     
    	protected function __construct($dbh)
    	{
    		$this->dbh = $dbh;
    		$this->p_params = array();
     
    		if( self::$cache_est_actif )
    		{
    			if( self::$sql == null )
    				self::$sql = array();
    			self::$sql[] = $this;
    		}
    	}
     
    	public function execute()
    	{
    		if( self::$cache_requete_est_actif )
    		{
    			if( self::$requetes == null )
    				self::$requetes = array();
    			self::$requetes[] = $this->debugRequete();
    		}
    		return parent::execute();
    	}
     
    	public function bindParam ( $parameter, 
    								$variable , 
    								$data_type = NULL ,  
    								$length = NULL ,  
    								$driver_options = array() )
    	{
    		if( is_bool($variable) && $data_type == PDO::PARAM_INT ){ $variable = intval($variable); }
     
    		$param 						= array();
    		$param["parameter"] 		= $parameter;
    		$param["variable"] 			= $variable;
    		$param["data_type"] 		= $data_type;
    		$param["length"] 			= $length;
    		$param["driver_options"] 	= $driver_options;
    		$this->p_params[] 			= $param;
     
    		return parent::bindParam($parameter,$variable,$data_type,$length,$driver_options);
    	}
     
    	public function debugRequete()
    	{
    		$retour = $this->queryString;
    		foreach( $this->p_params as $param )
    		{
    			switch( $param["data_type"] )
    			{
    				case PDO::PARAM_STR:
    					/*
    					$pattern 	= '/('.$param["parameter"].')[/s]{0,}[,]{0,}/i';
    					$matches 	= array();
    					preg_match($pattern, $retour, $matches );
    					if( count() == 0 )
    					{
    						echo "pattern : ".$pattern."\n";
    						die(var_dump($matches));
    					}
    					*/
     
    					$pattern 		= '`('.preg_quote("".$param["parameter"]).')([\s]{0,}[,]{0,})`i';
    					$replacement 	= "'".($param["variable"])."'$2";
    					$tmp			= $retour;
    					$tmp = preg_replace($pattern, $replacement, $tmp , 1 );
    					if( $retour == $tmp )
    					{
    						echo "pattern : ".$pattern."\n";
    						echo "retour : ".$retour."\n";
    					}
    					$retour = $tmp;
     
    					//$retour = str_replace($param["parameter"]."" , "'".$param["variable"]."'" , $retour );
    				break;
    				default:
    					/*
    					$pattern 	= '/('.$param["parameter"].')[/s]{0,}[,]{0,}/i';
    					$matches 	= array();
    					preg_match($pattern, $retour, $matches );
    					if( count() == 0 )
    					{
    						echo "pattern : ".$pattern."\n";
    						die(var_dump($matches));
    					}
    					*/
     
    					$pattern 		= '`('.preg_quote("".$param["parameter"]).')([\s]{0,}[,]{0,})`i';
    					$replacement 	= "".($param["variable"])."$2";
    					$tmp			= $retour;
    					$tmp = preg_replace($pattern, $replacement, $tmp , 1);
    					if( $retour == $tmp )
    					{
    						echo "pattern : ".$pattern."\n";
    						echo "retour : ".$retour."\n";
    					}
    					$retour = $tmp;
     
    					// $retour = str_replace($param["parameter"]."" , $param["variable"]."" , $retour );
    				break;
    			}
    		}
    		return $retour;
    	}
    }
    ?>
    La suite pour l'utiliser
    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
     
    <?
    class PDOPlus extends PDO
    {
    	public static $cache_est_actif = false;				// active l'historique des requetes;
    	public static $requetes;
    	protected $p_count;
     
    	public function __construct($dsn, $username="", $password="", $driver_options=array() )
    	{
    	   parent::__construct($dsn,$username,$password, $driver_options);
    	   $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOPlusStatement', array($this)));
    	}
     
    	public function prepare( $sql )
    	{
    		$retour = parent::prepare( $sql );
    		if( self::$cache_est_actif ) $this->p_count++;
     
    		return $retour;
    	}
     
    	public function count()
    	{
    		return $this->p_count;
    	}
     
    	public function exec( $sql )
    	{
    		if( self::$cache_est_actif )
    		{
    			if( self::$requetes == null )
    				self::$requetes = array();
    			self::$requetes[] = $sql;
    		}
    		return parent::exec( $sql );
    	}
    }
    ?>
    Il faut donc instancier PDOPlus et non PDO.

    bye

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Est-ce qu'en deux ans PDO a ajouté une méthode simple de Debug pour accéder aux requêtes générés, ou bien doit-on toujours utiliser ce 'truc de ninja' ?

  4. #4
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Ce sujet devrait être mis en Sticky. (En tout cas, si le sondage l'est, celui-ci devrait l'être)

  5. #5
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Hey minute, c'est de la crote cette facon de faire.
    Ca affiche pas réellement la requête que PDO essaie.

    Par exemple, PDO avait un bug avec les champs INT qui causait une erreur avec les LIMIT. Il encadrait les valeurs numérique dans des guillemets.

    Ici, en faisant les permutation avec un GREP, ce comportement n'est pas forcément reproduit.

    Ce qu'il faut, c'est une facon de RÉELLEMENT extraire la requête que PDO fait.


    Ho la la, moi qui était si heureux, je viens de me rendre compte que ce n'est qu'un WorkArround qui ne m'aide pas vraiment ... (ce qui n'enlève pas le mérite du très bel effort fait par kaymak !)

Discussions similaires

  1. affichage d'une requête
    Par poula dans le forum Forms
    Réponses: 2
    Dernier message: 18/12/2006, 14h47
  2. Affichage d'une requête
    Par Sorcier157 dans le forum Zend_Db
    Réponses: 6
    Dernier message: 27/10/2006, 10h30
  3. [MySQL] affichage d'une requête
    Par gailup dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/06/2006, 10h20
  4. [MySQL] Affichage d'une requête
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 31/01/2006, 10h54
  5. Modifier l'affichage d'une requête
    Par seal dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 14h26

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