我正在准备我的sql语句和绑定参数,如果出现问题,我会在catch块中捕获它们。但是,我想看看我处理了哪个查询。所以我扩展了PDO类(在互联网上找到它,不完全确定我在做什么或ATTR_STATEMENT_CLASS真正用于哪里。所以这是扩展的代码:
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 Version 5.2.17,MySQL version 5.0.92
答案 0 :(得分:0)
据我所知,使用预准备语句时无法查看实际查询
答案 1 :(得分:0)
您最好的选择是转换MySQL的常规日志选项。 在MySQL终端(或用于控制MySQL的任何其他首选程序/应用程序)中运行以下命令
SET GLOBAL general_log = ON;
SET GLOBAL general_log_file = 'path_to_file.log';
运行查询,检查文件。
答案 2 :(得分:0)
他们真的不需要扩展PDO类来完成他们所做的事情。只需创建一个新实例,然后在创建后添加(或删除)该属性,而不是在。
期间话虽如此,有一种内置的方式可以输出关于语句的调试信息,并使用PDOStatement->debugDumpParams
。这不会让你看到编译版本(对于支持它的数据库已完成数据库端),但它可以让你轻松地看到查询和绑定参数。
请注意,请勿在实时系统上启用此功能。它可以为您的网站的攻击者提供一个关于系统如何设置以及它们可以接管(并销毁或以其他方式破坏)的方式的大线索。