2011-07-26 22 views
0

我正在准备我的sql语句和绑定参数给它,如果出现错误,我赶上他们在一个catch块。但是,我想看看我处理了哪个查询。所以我扩展PDO类(发现它在互联网上,并不完全知道我在做什么或在ATTR_STATEMENT_CLASS是真的因此,这是进一步扩展的代码:如何查看使用php PDO处理的查询? !

class PDOTester extends PDO { 
public function __construct($dsn, $username = null, $password = null, $driver_options = array()) { 
    parent::__construct($dsn, $username, $password, $driver_options); 
    $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementTester', array($this))); 
} 
} 
class PDOStatementTester extends PDOStatement { 
protected $connection; 

protected function __construct(PDO $connection) 
{ 
    $this->connection = $connection; 
} 

public function execute() { 
    try { 
     parent::execute(); 
    } catch (PDOException $e) { 
     $e->errorInfo[3] = $this->queryString; 
     echo '<pre>'; 
     var_dump($this); 
     var_dump($this->connection); 
     echo '</pre>'; 
     throw $e; 
    } 
} 
} 

但是,来了!问题,我用命名值绑定到它的参数,但是当我看到SQL查询,然后我看到了命名参数,而不是价值观

例如,我使用它像:

try { 
$sql = "INSERT INTO table (column1, column2) VALUES (:column1, :column2)"; 
$stmt = $db->preapre($sql); 
$stmt->bindParam(':column1', $column1, PDO::PARAM_STR); 
$stmt->bindParam(':column2', $column2, PDO::PARAM_INT); 
$stmt->execute(); 
} catch (PDOException $e) { 
echo $e->errorInfo[3]; 
} 

但然后我看到值:column1,:column2,而不是实际变量! 可以请别人帮我解决问题(例如提供更好的修改我使用的扩展名)?

PHP版本5.2.17,MySQL版本5.0.92

回答

0

据我所知,目前还没有办法看到实际的查询使用预处理语句

0

当你最好的办法是把MySQL的一般日志选项。 运行MySQL中端以下(或任何其他的首选方案/应用程序使用控制MySQL的)

SET GLOBAL general_log = ON; 
SET GLOBAL general_log_file = 'path_to_file.log'; 

运行查询,检查文件。

+0

棒极了! Thnx,这非常有用! – Orhan

+0

如果查询中存在语法错误或缺少列/字段(这是引发PDOException的可能原因之一),它是否仍然要记录这些内容? (部分是为了我的好奇心,部分是为了一般性的澄清) – Zimzat

+0

它会记录任何实际获得到MySQL的东西。如果你调用一个抛出PDOException的非现有函数(假设存在这样的错误实现),它将不会记录它。它会在事务中记录失败的查询,格式错误的查询等等 - 基本上任何事情都会到达MySQL守护进程。 –

0

他们真的不需要扩展PDO类来做他们做的事。只需创建一个新实例,然后在创建后添加(或删除)该属性,而不是在创建期间。

这就是说,有一种内置的方式输出有关语句的调试信息,这就是使用PDOStatement->debugDumpParams。这不会让你看到编译后的版本(对于支持它的数据库,这是为数据库端完成的),但它可以让你轻松地看到查询和绑定参数。

请注意,不要在实时系统上启用此功能。它可能会给你的网站攻击者一个关于你的系统如何建立以及他们能做什么接管(并销毁或以其他方式破坏)的大问题。

+0

thnx的功能!但是,这仍然不会输出参数的值。 – Orhan

+0

......咦。所以它没有。我误读了该页面上的示例。我想这就是为什么Zend的Db适配器自己封装了所有这些方面的原因。 – Zimzat