Afficher les caractéristiques d'un objet

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 déc. 2007, 17:42

Bonjour,

Dans un de mes développements actuels, j'utilise Propel 1.3b2 qui est basé sur PDO.

Une de mes requêtes ne me retourne pas le résultat escompté et je désire afficher la requête réellement exécutée pour savoir si ce sont mes données qui cause le soucis ou s'il s'agit de la requête.

si je tente d'afficher la requête générée par le criteria ($c->toString()), je ne suis pas sûr d'obtenir la bonne requête, je désires donc obtenir la requête réellement exécutée.
En gros, l'équivalent de l'écriture
Propel::getConnection()->getLastExecutedQuery()
lorsque Propel utilisait encore Créole.

Si vous ne savez pas répondre à ma 1ere question mais que vous connaissez un moyen d'afficher les méthodes publiques d'un objet à partir d'une de ses instances, vous pourrez tout de même m'aider ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 59 Messages

18 déc. 2007, 17:58

ceci devrait faire l'affaire je crois get_class_methods ( mixed $class_name )

Mammouth du PHP | 505 Messages

18 déc. 2007, 18:00

A partir du nom de la class ou d'une instance, le get_class_methods() devrait répondre a tes besoins

Grillé d'une 1/2 seconde, du coup je complete...

Tu peux aussi t'appuyer sur la classe Reflection

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 déc. 2007, 18:32

Merci à vous pour cette fonction ... ça faisait un moment que je la cherchais :pouce:

Sinon, même avec cette fonction, je n'ai pas trouvé de quoi avancer sur PDO ...
Si quelqu'un à une autre idée, je suis preneur ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 déc. 2007, 20:44

je n'ai pas trouvé de quoi avancer sur PDO ...
Ce n'est pas PDO qu'il faut attaquer, ce serait plutôt Propel (même si on peut étendre PDO à la place). L'idée serait d'étendre la méthode qui exécute les requêtes pour garder trace de la dernière requête exécutée, mais en fait je viens de télécharger Propel et je vois que c'est déjà ce qu'ils font afin de logger les requêtes. Vu dans runtime/classes/propel/util/PropelPDO.php:
public function prepare($sql, $driver_options = array())
{
	Propel::log($sql, Propel::LOG_DEBUG);
	return parent::prepare($sql, $driver_options);
}
...donc logiquement il y a un log quelque part à partir duquel tu devrais pouvoir récupérer ta requête. Au pire, tu peux émuler la méthode qui a disparu
public function prepare($sql, $driver_options = array())
{
	$this->lastExecutedQuery = $sql;
	Propel::log($sql, Propel::LOG_DEBUG);
	return parent::prepare($sql, $driver_options);
}

private $lastExecutedQuery;
public function getLastExecutedQuery()
{
	return $this->lastExecutedQuery;
}
Tout ça c'est en imaginant que toutes les requêtes de Propel passent par la même méthode (ce qui ne semble pas le cas pour certaines d'entre elles :?). Sinon, essaie d'étendre PDO directement.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 déc. 2007, 10:23

Merci Hubert pour ta reflexion.

La solution que nous avons retenue est de développer notre propre classe de log que nous allons affecter à Propel.
Vu que nous voulions aussi savoir combien de requête étaient exécutées à chaque get, on va utiliser cette classe.

Merci à tous
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer