logo

Knowledge Is Power

 
 

- Reinit des nouveaux posts -

- Recherche -

Messages Privés - Derniers posts
S'enregistrer - Login - Liste des membres
Vous logger : Login Pass

Programmation - Scripting, langages interprétés >> [PDO] Récupérer la dernière requête préparée executée Newtopic | Reply
poster txt
lombredudragon
Inscrit le 11-01-2004
Posté le 13-01-2011 14:43

Salut All,

Je galère un peu avec PDO et je vois que je ne suis pas le seul :

http://www.neowin.net/forum/topic/900742-php-get-actual-sql-query-from-prepared-statement/

J'ai une classe PHP qui me permet de gérer des hash et leur texte associé (plaintext). J'ai ma classe hashDB qui hérite de PDO et qui me sert d'"interface" pour mysql.

Du coup, pour avoir une trace des dernières requêtes exécutées, j'ai redéfinie la méthode query et exec sur le même principe :

Code:

public function query($query)
{
$time_start = microtime(true);

$result = parent::query($query);

$time_stop = microtime(true);

$this->last_query_lenght = ($time_stop-$time_start);

$this->queries[] = '<b>'.$this->last_query_lenght.'s </b>: '.$query;

return $result;
}



La partie de code qui nous intéresse est la suivante.

Code:

$query = "INSERT INTO ".constant(strtoupper($this->get_type()).'_TABLE')."
SET ".$this->get_type()."_hash = ?, ".$this->get_type()."_plaintext = ?";

$prep = $hashDB->prepare($query);

$prep->bindValue(1, $hash, PDO::PARAM_STR);
$prep->bindValue(2, $word, PDO::PARAM_STR);

$result = $prep->execute();



Comment faire pour récupérer la requête qui vient d'être préparée et exécutée pour la mettre dans un log ?

Car PDO::prepare renvoi un PDOStatement et je n'ai pas la main dessus.

Il faudrait que je définisse une classe hashDBStatement qui hérite de PDOStatement et que je redéfinisse la méthode execute pour logguer les requêtes ? Ou y'a plus simple ?

J'espère que je me suis pas trop embrouillé dans mon voc


Merci d'avance


_________________________


[ Ce Message a été édité par: lombredudragon le 2011-01-13 14:44 ]
profil | edit | quote
lombredudragon
Inscrit le 11-01-2004
Posté le 13-01-2011 15:03

Erf il semblerait que j'ai une piste :

http://stackoverflow.com/questions/210564/pdo-prepared-statements/210693#210693

La requête et les paramètres sont envoyés séparément.


_________________________


[ Ce Message a été édité par: lombredudragon le 2011-01-13 15:04 ]
profil | edit | quote
lombredudragon
Inscrit le 11-01-2004
Posté le 07-07-2011 01:22

Une solution qui vaut ce qu'elle vaut
Si ça peut aider quelqu'un

Code:


public function prepareAndExecute($query, $params, $destroy_prep=false)
{
$prep = $this->prepare($query);

if(is_array($params) && count($params))
{
$data = array();

foreach($params as $key => $values)
{
$prep->bindValue($key, $values['data'], $values['type']);

$data[] = $values['data'];
}
}

if(DEBUG_SQL)
{
$time_start = microtime(true);
}

$result = $prep->execute();

if(DEBUG_SQL)
{
$time_stop = microtime(true);

$this->interpolateQuery($prep->queryString, $data, $time_stop-$time_start);
}

if($destroy_prep)
{
$prep = null;
}

return array('result' => $result, 'prep' => ($prep) ? $prep : false);
}

public static function interpolateQuery($query, $params)
{
$keys = array();

# construit une expression régulière pour chaque paramètre
foreach ($params as $key => $value)
{
if (is_string($key))
{
$keys[] = '/:'.$key.'/';
}
else
{
$keys[] = '/[?]/';
}
}

$query = preg_replace($keys, $params, $query, 1, $count);

#trigger_error('replaced '.$count.' keys');

return $query;
}



_________________________

profil | edit | quote
Newtopic | Reply

Online : aqifozi, Chriscor, iiyotem, Josephvob, Kvwcftousy, LorenHop, Michaelexcat, Michaelwer, MiguIdeomy, Thomasdiz et 83 Guests


Retour Index NewFFR Repository : http://taz.newffr.com
Cagades à Stick : http://alcane.newffr.com
Forum HTML et Archive -> ici
ForumFR Sql/Xml (2006/04) (SF pas à jour du tout...) - Alive since 2001 Newffr.com
Pour toute plainte ou problème -> Contacter Borax, Hyatus, Tweakie ou Stick par message privé (ou Gueulez sur le forum :) )
Retour haut de page