Vraag terug van door PDO opgestelde verklaring

Is er een manier om de query op te halen die is gebruikt om een ​​PDO Prepared-instructieobject te genereren?


Antwoord 1, autoriteit 100%

Probeer $statement->queryString.


Antwoord 2, autoriteit 43%

De eenvoudigste manier om te bereiken wat je wilt is:

$statement->debugDumpParams();

Zorg er wel voor dat je het toevoegt na het uitvoeren van de instructie.


Antwoord 3, autoriteit 29%

Als u niet tegen uitbreiding van het standaard \PDO- en \PDOStatement-object bent, kunt u overwegen te kijken naar:

github.com/noahheck/E_PDOStatement

Deze uitbreiding van PDO stelt u in staat een volledige query-instructie te zien als een voorbeeld van wat op databaseniveau kan worden uitgevoerd. Het gebruikt regex om de gebonden parameters van uw PDO-statement te interpoleren.

Door de standaard \PDOStatement-definitie uit te breiden, kan E_PDOStatement deze verbetering bieden aan de standaardfunctionaliteit zonder dat uw normale werkstroom moet worden gewijzigd.

Disclaimer: ik heb deze extensie gemaakt.

Ik hoop alleen dat iemand anders er iets aan heeft.


Antwoord 4

Deze procedure werkt. Omdat debugDumpParams() de uitvoer niet retourneert. Hier is een kleine truc die ik heb ontworpen.

// 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;

Ik hoop dat dit helpt.

Other episodes