我们使用Doctrine,一个PHP ORM。我创建了一个这样的查询:

$q = Doctrine_Query::create()->select('id')->from('MyTable');

然后在函数中,我添加了各种where子句和适当的东西,像这样

$q->where('normalisedname = ? OR name = ?', array($string, $originalString));

稍后,在execute()-ing该查询对象之前,我想打印出原始SQL以检查它,并这样做:

$q->getSQLQuery();

但是,这只打印准备好的语句,而不是完整的查询。我想看看它正在发送什么到MySQL,但相反,它正在打印一个准备好的语句,包括?是否有一些方法可以看到'full'查询?


当前回答

也许它对某些人有用:

// Printing the SQL with real values
$vals = $query->getFlattenedParams();
foreach(explode('?', $query->getSqlQuery()) as $i => $part) {
    $sql = (isset($sql) ? $sql : null) . $part;
    if (isset($vals[$i])) $sql .= $vals[$i];
}

echo $sql;

其他回答

$sql = $query->getSQL();

$parameters = [];
    foreach ($query->getParameters() as $parameter) {
        $parameters[] = $parameter->getValue();
    }

$result = $connection->executeQuery($sql, $parameters)
        ->fetchAll();

没有其他真正的查询,这就是预处理语句的工作方式。这些值绑定在数据库服务器中,而不是应用程序层。

看到我对这个问题的回答:在PHP与PDO,如何检查最终的SQL参数化查询?

(为了方便起见,这里重复一遍:)

使用带参数化值的准备语句不仅仅是动态创建SQL字符串的另一种方法。在数据库中创建一个准备好的语句,然后单独发送参数值。 所以发送到数据库的可能是一个PREPARE…,然后SET…最后执行.... 你将无法获得一些SQL字符串,如SELECT * FROM…,即使它会产生相同的结果,因为没有这样的查询实际上发送到数据库。

Doctrine并不是向数据库服务器发送一个“真正的SQL查询”:它实际上是使用准备好的语句,这意味着:

发送语句,以便对其进行准备(这是$query->getSql()返回的内容) 然后,发送参数(由$query->getParameters()返回) 执行准备好的语句

这意味着PHP端从来没有一个“真正的”SQL查询——因此Doctrine无法显示它。

您可以使用以下方法轻松地访问SQL参数。

   $result = $qb->getQuery()->getSQL();

   $param_values = '';  
   $col_names = '';   

   foreach ($result->getParameters() as $index => $param){              
            $param_values .= $param->getValue().',';
            $col_names .= $param->getName().',';
   } 

   //echo rtrim($param_values,',');
   //echo rtrim($col_names,',');    

因此,如果输出$param_values和$col_names,就可以获得通过sql和相应列名传递的参数值。

注意:如果$param返回一个数组,你需要重新迭代,因为IN(:?)中的参数通常是一个嵌套数组。

同时,如果你找到了其他方法,请与我们分享:)

谢谢你!

你可以使用:

$query->getSQL();

如果您正在使用MySQL,您可以使用Workbench查看正在运行的SQL语句。 你也可以使用下面的命令查看mysql中正在运行的查询:

 SHOW FULL PROCESSLIST \G