Bonjour à tous,

Je cherche à pouvoir récupérer la requête SQL générée par PDO (avec la méthode PREPARE).
La syntaxe de ma structure est identique au contenu du tuto PHP : Model View Controller (designs patterns avancés)

Après plusieurs recherches sur Google, aucune piste pouvant répondre à ma question...

Merci pour votre aide !

8 réponses


connected
Réponse acceptée

Bonjour,

tu peux faire comme ceci alors :

$var1 = 9;
$var2 = 'jojo1084';
$sth = $dbh->prepare('SELECT *
    FROM coucou
    WHERE var1 = :var1 AND var2 = :var2');

$params = [
  'var1' => $var1,
  'var2' => $var2
];
$sth->execute($params);

echo dump($sth->queryString, $params);

function dump($query, $params) {
  $keys = array();
  $values = $params;    
  foreach ($params as $key => $value) {
    if (is_string($key)) {
      $keys[] = '/:'.$key.'/';
    } else {
      $keys[] = '/[?]/';
    }

    if (is_array($value))
      $values[$key] = implode(',', $value);

    if (is_null($value))
      $values[$key] = 'NULL';
  }    
  array_walk($values, create_function('&$v, $k', 'if (!is_numeric($v) && $v!="NULL") $v = "\'".$v."\'";'));

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

  return $query;
}

La fonction n'est pas de moi, elle était sur un forum. Il y a moyen de l'optimiser. Ce qui est important c'est d'utiliser queryString et de faire matcher les paramètres.

Tiens nous au courant.

Bonjour,

Peut-être avec debugDumpParams.

Exemple :

$var1 = 9;
$var2 = 'jojo1084';
$sth = $dbh->prepare('SELECT *
    FROM coucou
    WHERE var1 = :var1 AND var2 = :var2');
$sth->bindParam(':var1', $var1);
$sth->bindValue(':var2', $var2);
$sth->execute();

$sth->debugDumpParams();
$statement = $db->prepare('SELECT * FROM table WHERE id = :id');
$result = $statement->execute(['id' => $id]);

return $result->fetchAll();

@SquallX en quoi le fetchAll te donnerait la requête ?

jojo1084
Auteur

En effet, je n'aurai que le résultat de la-dite requête...
Cependant, la solution proposée par Connected ne me donne pas le résultat escompté.
Quelqu'un aurait-il une solution ?
Je vais m'expliquer mieux par un petit bout de code :

$id = 25
$statement = $db->prepare('SELECT * FROM table WHERE id = :id');
$result = $statement->execute(['id' => $id]);
echo $result->getStatement();

Et le résultat affiché serait : SELECT * FROM table WHERE id = 25

Merci à tous...

Au temps pour moi je n'ai fait que survoler le sujet mais il me vient une question :

Quelle est l'utilité ?

Sinon il te faudrait faire une petite fonction en plus qui serait une surcouche à PDO, de sorte que quand tu fasses un $db->myPrepare('SELECT etc...) ça t'enregisterait la requête dans un tableau (ou autre) et te la formaterait avec les attributs. Nativement je ne pense pas que ça soit possible avec PDO.

Par contre je n'en vois pas l'utilité étant donné que ta requête tu l'as et tu sais quels paramètres tu lui passes.

jojo1084
Auteur

En effet, remarque pertinante.
Je souhaite récupérer la requête pour vérifier ce qu'il fait.
Car malgré que dans ma BDD j'ai des lignes qui correspondent à ce que je dois avoir, avec PDO, je ne récupère rien !
Or, en prenant ma requête et en mettant les attributs manuellement, si j'exécute cette requête dans phpmyadmin (par exemple), alors là ça fonctionne. Mes lignes sont correctement filtrées.
Bizare !

Comment ça tu ne récupères rien ?

Si tu fais une bonne requête en respectant les méthodes de PDO la requête doit te retourner un résultat