2012-06-20 50 views
12

可能重複:
Retrieve (or simulate) full query from PDO prepared statementPDO調試 - 在綁定後查看查詢?

我想不通爲什麼我的查詢返回0行..它實現了一些非常有活力的搜索功能,以及很多,如果/循環語句等。爲了調試它,我想看到什麼字符串正在發送到服務器。有沒有辦法通過PHP來做到這一點?

是否有方法可以詢問服務器「最後一個查詢是什麼」,或告訴PDO「向我顯示您發送的內容」?

我看到一個回覆​​使用str_replace手動輸入值代替:fieldValue,但它可能是一個語法問題(或者它可能是通過一個不正確的循環等),這種方法不起作用。

使用bindValue(":fieldValue", $value);如果這有所作爲。

編輯

原來這是一個簡單的if ($var="true") { ...應該已經if ($var=="true") { ...。 PHP我猜在這個意義上和Java不一樣?無論哪種方式,問題仍然存在(正如我經常遇到這種情況)。我不得不使用一系列echo "You are Here";來發現此錯誤,因爲它在技術上是有效的,但不正確。如果我有最終的SQL語句,我可以看到「哦,我的代碼已經添加了where column = true,必須經歷錯誤的IF ......」。

+1

如果準備/綁定不效仿,而你說話不存在任何地方查詢。語句和綁定對數據庫是不可或缺的。但是,在開發服務器上啓用'query_log'(永遠不要在生產環境中執行)可能會對已完成的操作有所瞭解。 – Wrikken

+0

這就是事情;我不知道該怎麼嘗試。我通常使用簡單的'echo $ sql'來執行此操作,其中'$ sql'是我的語句,但是使用PDO(我是新來的),它只是向我顯示'SELECT column FROM table WHERE column =:fieldValue' which doesn如果哪裏的聲明最終在某處出錯,我將無法幫助我。 – StuckAtWork

+2

[從PDO預備語句中檢索(或模擬)完整查詢](http://stackoverflow.com/questions/3754530/retrieve-or-simulate-full-query-from-pdo-prepared-statement)和http ://stackoverflow.com/questions/530627/getting-a-pdo-query-string-with-bound-parameters-without-executing-it和http:// stackoverflow。com/questions/1786322/in-php-with-pdo-how-to-check-the-final-sql-parametrized-query –

回答

0

這是關於SQL調試的最常見的神話。 「準備好後我需要查看查詢,以便能夠判斷是否發生了錯誤」。事實是,你不,我會告訴你爲什麼。

一旦查詢準備好了,佔位符就可以被認爲是有效字符串/整數。你不在乎它裏面有什麼。另外,如果你正確設置了PDO,你會得到一個詳細的PDOException,詳細描述了你已經有的錯誤以及發生錯誤的完整回溯,再加上你從MySQL中得到了錯誤字符串,這使得語法錯誤很容易找到。

要啓用PDO異常和禁用仿真準備:

$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password"); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
+1

我有我的錯誤處理正確;問題是沒有錯誤。我需要知道實際發送的內容是什麼,以便能夠告訴我在代碼中獲取信息的位置。如果不能檢查最後的字符串,我不知道什麼在做什麼。 「返回0行」,而不是「拋出錯誤」。 – StuckAtWork

+0

@StuckAtWork:如果你不使用全局空間這樣的東西,你應該沒有問題去告訴你的查詢有什麼問題。 –

+1

請參閱編輯答案;這個問題並不明顯,但是如果我能夠看到它究竟具有哪些約束力,那就一定會有問題。根據幾種情況,它會綁定與':fieldValue'不同的東西。我必須手動檢查並檢查哪些行正在執行,以查看「:fieldValue」被綁定爲的內容。 – StuckAtWork