web-dev-qa-db-fra.com

Récupère la requête de l'instruction préparée par PDO

Existe-t-il un moyen de récupérer la requête utilisée pour générer un objet d'instruction PDO Prepared?

46
ChrisR
31
Arkh

Si vous n'êtes pas opposé à l'extension des objets\PDO et\PDOStatement par défaut, vous pouvez envisager:

github.com/noahheck/E_PDOStatement

Cette extension à PDO vous permet de voir une instruction de requête complète comme exemple de ce qui peut être exécuté au niveau de la base de données. Il utilise regex pour interpoler les paramètres liés de votre instruction PDO.

En étendant la définition par défaut de\PDOStatement, E_PDOStatement peut offrir cette amélioration à la fonctionnalité par défaut sans qu'il soit nécessaire de modifier votre flux de travail normal.

Disclaimer: J'ai créé cette extension.

J'espère juste que cela sera utile à quelqu'un d'autre.

9
myesain

Cette procédure fonctionne. Puisque debugDumpParams () ne renvoie pas la sortie. Voici un petit truc que j'ai conçu.

// get the output before debugDumpParams() get executed 
$before = ob_get_contents();

//start a new buffer
ob_start();

// dump params now
$smt->debugDumpParams();

// save the output in a new variable $data
$data = ob_get_contents();

// clean the output screen
ob_end_clean();

// display what was before debugDumpParams() got executed
printf("%s", $before);

$statement = "";

// Now for prepared statements
if (stristr($data, 'Sent SQL') !== false)
{

// begin extracting from "Sent SQL"
$begin = stristr($data, 'Sent SQL');

// get the first ] square bracket
$square = strpos($begin, "]");

// collect sql
$begin = substr($begin, $square + 1);
$ending = strpos($begin, "Params");

$sql = substr($begin, 0, $ending);
$sql = trim($sql);

  // sql statement here
  $statement = $sql;
}
else
{
  if (stristr($data, 'SQL') !== false)
  {
     $begin = stristr($data, 'SQL');
     // get the first ] square bracket
     $square = strpos($begin, "]");

     // collect sql
     $begin = substr($begin, $square + 1);
     $ending = strpos($begin, "Params");

     $sql = substr($begin, 0, $ending);
     $sql = trim($sql);

     $statement = $sql;
  }

}


// statement here
echo $statement;

J'espère que cela t'aides. 

0
Ifeanyi Amadi

Auto-promotion: https://github.com/ellisgl/GeekLab-GLPDO Vous pouvez générer la requête attendue avec la méthode de débogage. Je l'ai mis à jour récemment. 

0
EllisGL