Bonjour,
Avec PDO, Je cherche à récupérer la requête préparée. Juste avant l'exécution.
Je ne vois pas vraiment comment faire...
QQun pour me m'aider?
Merci.
Version imprimable
Bonjour,
Avec PDO, Je cherche à récupérer la requête préparée. Juste avant l'exécution.
Je ne vois pas vraiment comment faire...
QQun pour me m'aider?
Merci.
S'il n'existe pas ce que tu cherche dans la doc, c'est que ca n'existe pas...
or je ne vois rien qui y ressemble.
http://fr.php.net/manual/fr/class.pdostatement.php
Tu n'a donc plus qu'a trouver ou ton Statement est construit et récuperer directement la requete passée a PDO::prepare
hello,
Pour ce faire, il faudrait que tu extends pdo et pdo statment.
Regardes dans les commentaires de la doc il y à des exemples de déposés. Sinon jte déposerai le mien.. C'est simple à faire.
bye
Re,
Merci pour cette réponse Kaymak. Etendre PDO et PDOStatement était bien dans mon optique mais je ne vois pas comment faire pour récupérer la requête préparée et les exemples de la doc ne me parlent pas.
Ou peut-être que je ne regarde pas au bon endroit...
La requete préparée = La requete telle que tu l'a passé a PDO::Prepare
Si c'est bien ca que tu veux récuperer, il suffit d'ajouter un champ la stockant et de redéfinir la methode prepare. Puis d'ajouter une methode getRequest sur ton extends de PDOStatement
Si dans ton esprit, requete préparée = requete avec les valeurs... ben là ca a beaucoup moins d'interet deja, on perds tout l'apport de PDO, mais il faudra que tu redéfinisse également les methodes bindParam et bindValue pour reconstruire la requete "a la main", en sachant que ca ne sera jamais la requete telle qu'elle sera passée a la base, parce que dans le cas des requetes préparées, les requetes et les valeurs sont envoyées séparément.
Ouaip, perso, moi je l'avais fait au début pour pouvoir débugger mes requêtes.Citation:
La requete préparée = La requete telle que tu l'a passé a PDO:repare
Si c'est bien ca que tu veux récuperer, il suffit d'ajouter un champ la stockant et de redéfinir la methode prepare. Puis d'ajouter une methode getRequest sur ton extends de PDOStatement
Si dans ton esprit, requête préparée = requete avec les valeurs... ben là ca a beaucoup moins d'intérêt deja, on perds tout l'apport de PDO, mais il faudra que tu redéfinisse également les methodes bindParam et bindValue pour reconstruire la requete "a la main", en sachant que ca ne sera jamais la requete telle qu'elle sera passée a la base, parce que dans le cas des requetes préparées, les requetes et les valeurs sont envoyées séparément.
Mais bon c'était il un quelques temps maintenant et j'avoue ne plus m'en servir aujourd'hui.
Whatever pour étendre pdo :
Après tu instancies du PDOPlus et pas du PDO.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class PDOPlus extends PDO{ 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 ){ return parent::prepare( $sql ); } public function exec( $sql ){ return parent::exec( $sql ); } } class PDOPlusStatement extends PDOStatement{ public $dbh; protected function __construct($dbh){ $this->dbh = $dbh; } public function execute(){ return parent::execute(); } }
Le reste c'est à toi de l'implémenter ; )
bye
Ce que j'entends par requête préparée, c'est bien cela :la requête avec les valeurs. Mon but n'est pas d'usurper le rôle de PDO mais d'écrire dans un système de log toutes les requêtes envoyées vers le SGBD. (je sais que cela peut paraître étrange...)
Effectivement ceci pourrait me poser problème... je vais encore chercher.
Si tu veux logger les requetes et les valeurs, le mieux reste de les logger de maniere separée (ou a la suite) du genre :
Requete : SELECT 1 FROM DUAL WHERE 1 = :var1
Valeurs : [2]
Requete : SELECT 1 FROM DUAL WHERE 1 = :var1 AND 2 = :var2
Valeurs : [1][2]
Ca c'est faisable en surchargeant PDO et PDOStatement.
Si tu veux réellement logger les requetes avec les valeurs renseignées, il faut que tu fasse le travail de remplacement toi meme... et là le gros probleme c'est que ca depend du TYPE de la colonne, et meme de base de données utilisée derriere.
Petits exemples :
* Les dates et leurs format de stockage (timestamp unix, YYYYMMDDHHIISS ou moins, chaines de caracteres a l'arrache, type "date" obtenu avec to_date, etc...)
* Les booleens TRUE/FALSE a convertir en général en 0/1
* Les colonnes de type entier qui ne doivent pas etre entourés de "quotes" (')
* La gestion de la valeur NULL...
Et la liste n'est pas exhaustive.
Bon d'accord! Je crois que là, je n'ai pas vraiment le choix.
Ton idée me semble être la plus adéquate mais je ne saurais jamais ce que le SGBD traite réellement...
Merci de votre aide à tous les deux.