2011-07-26 49 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