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.