我正在準備我的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守護進程。 –