我正在准备我的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
棒极了! Thnx,这非常有用! – Orhan
如果查询中存在语法错误或缺少列/字段(这是引发PDOException的可能原因之一),它是否仍然要记录这些内容? (部分是为了我的好奇心,部分是为了一般性的澄清) – Zimzat
它会记录任何实际获得到MySQL的东西。如果你调用一个抛出PDOException的非现有函数(假设存在这样的错误实现),它将不会记录它。它会在事务中记录失败的查询,格式错误的查询等等 - 基本上任何事情都会到达MySQL守护进程。 –