2011-06-08 104 views
1

我正在用PHP 5.3與Pear MDB2一起工作。我正在編寫一個更新數據庫的項目,在讓它開始更改數據之前,我想查看autoPrepare()和execute()生成的SQL查詢在實際執行之前的樣子。如何獲取Pear MDB2生成的SQL而不執行它?

我打算這樣創建和執行更新查詢:

$stmt = $db->extended->autoPrepare($tableName, $tableColumns, 
    MDB2_AUTOQUERY_UPDATE, 'id = ' . $db->quote(12345, 'integer'), 
    $tableColumnTypes)); 

    $res =& $stmt->execute($tableColumnValues); 

我已經知道我可以通過訪問$stmt->query看到autoPrepare()與佔位符值生成的SQL。我希望看到由​​生成的已完成的SQL,其值用於替換佔位符,而不實際將查詢發送到數據庫

我該怎麼做?

回答

5

準備語句在服務器端編譯,所以在執行前無法看到它們。每例如,在MySQL中,如果你想執行一個事先準備好的聲明,什麼MDB2實際上做的是:

PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?'; 
SET @baz = 'baz'; 
EXECUTE stmt USING @baz; 

服務器從來沒有「返回」它執行的實際查詢。如果你想看看是什麼查詢執行,你必須設置一個查詢日誌。

每例如,在MySQL(my.cnf中):

[mysqld] 
general_log_file = /var/log/mysql_queries.log 
general_log = 1 

查詢日誌將顯示,對於上面的查詢示例:

Query  PREPARE stmt FROM 'SELECT * FROM foo WHERE bar = ?'; 
Query  SET @baz = 'baz'; 
Query  EXECUTE stmt USING @baz; 
Execute SELECT * FROM foo WHERE bar = 'baz'; 
+0

哦,我知道了...我想我早就聽說過這件事,但我忘了它。它與Pear MDB2'autoExecute()'(不是'autoPrepare()')方法有什麼不同?文檔(http://pear.php.net/manual/en/package.database.mdb2.intro-auto.php)似乎表明查詢將包含列值而不是佔位符。 – 2011-06-10 13:15:53

+0

@L S:從代碼中我可以看到,'autoExecute'調用'autoPrepare',所以不會有任何區別。 – netcoder 2011-06-10 13:22:55

0
print_r ($db->last_query, true); 
+0

感謝您的建議,但是在***調用'$ stmt-> execute()'之後,這隻能工作***嗎?我需要在***之前訪問完成的SQL語句***。 – 2013-07-24 13:07:02

相關問題