从PDO准备好的语句中获取查询

时间:2010-02-11 08:40:47

标签: php mysql pdo

有没有办法检索用于生成PDO Prepared语句对象的查询?

5 个答案:

答案 0 :(得分:31)

答案 1 :(得分:9)

如果您不反对扩展默认的\ PDO和\ PDOStatement对象,您可以考虑查看:

github.com/noahheck/E_PDOStatement

PDO的这个扩展允许您查看完整的查询语句,作为可能在数据库级别执行的操作的示例。它使用正则表达式来插入PDO语句的绑定参数。

通过扩展默认的\ PDOStatement定义,E_PDOStatement能够为默认功能提供此增强功能,而无需修改您的正常工作流程。

免责声明:我创建了此扩展程序。

我希望它对别人有帮助。

答案 2 :(得分:1)

实现所需目标的最简单方法是:

$statement->debugDumpParams();

只需确保在执行语句后添加它即可。

答案 3 :(得分:0)

自我推销:https://github.com/ellisgl/GeekLab-GLPDO 您可以使用调试方法输出预期查询的内容。我最近一直在更新它。

答案 4 :(得分:0)

此过程有效。由于debugDumpParams()不返回输出。这是我设计的一个小技巧。

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

希望这会有所帮助。