3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
你這樣說(shuō):
我從沒(méi)有看到最終查詢,因?yàn)樗寻l(fā)送到數(shù)據(jù)庫(kù)
好吧,實(shí)際上,在使用準(zhǔn)備好的語(yǔ)句時(shí),沒(méi)有“ 最終查詢 ”之類的東西:
首先,將一條語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù),并在那里準(zhǔn)備
數(shù)據(jù)庫(kù)解析查詢,并建立查詢的內(nèi)部表示
并且,當(dāng)您綁定變量并執(zhí)行該語(yǔ)句時(shí),只有變量會(huì)發(fā)送到數(shù)據(jù)庫(kù)
然后數(shù)據(jù)庫(kù)將值“注入”到語(yǔ)句的內(nèi)部表示中
因此,回答您的問(wèn)題:
有沒(méi)有一種方法可以捕獲由PDO發(fā)送到數(shù)據(jù)庫(kù)的完整SQL查詢并將其記錄到文件中?
否:由于任何地方都沒(méi)有“ 完整的SQL查詢 ”,因此無(wú)法捕獲它。
出于調(diào)試目的,您可以做的最好的事情是通過(guò)將值注入到語(yǔ)句的SQL字符串中來(lái)“重構(gòu)”一個(gè)“真實(shí)的” SQL查詢。
在這種情況下,我通常要做的是:
使用占位符回顯與該語(yǔ)句對(duì)應(yīng)的SQL代碼
并在之后使用
var_dump
(或等效項(xiàng))顯示參數(shù)的值即使您沒(méi)有可以執(zhí)行的任何“真實(shí)”查詢,通常也足以看到可能的錯(cuò)誤。
就調(diào)試而言,這并不好-但這是準(zhǔn)備好的語(yǔ)句的價(jià)格及其帶來(lái)的優(yōu)勢(shì)。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
在數(shù)據(jù)庫(kù)日志中查找
盡管Pascal MARTIN認(rèn)為PDO不會(huì)一次向數(shù)據(jù)庫(kù)發(fā)送完整的查詢是正確的,但是ryeguy關(guān)于使用DB的日志記錄功能的建議實(shí)際上使我可以看到完整的查詢是由數(shù)據(jù)庫(kù)組裝和執(zhí)行的。
方法如下:(這些說(shuō)明適用于Windows計(jì)算機(jī)上的MySQL-您的工作量可能會(huì)有所不同)
在
my.ini
,下[mysqld]
部分中,添加一個(gè)log
命令,如log="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
重新啟動(dòng)MySQL。
它將開始記錄該文件中的每個(gè)查詢。
該文件將快速增長(zhǎng),因此請(qǐng)確保在完成測(cè)試后將其刪除并關(guān)閉日志記錄。

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)然,您可以使用此模式進(jìn)行調(diào)試。{{ PDO::ATTR_ERRMODE }} 只需在查詢之前添加新行,即可顯示調(diào)試行。
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$db->query('SELECT *******');
- 3 回答
- 0 關(guān)注
- 680 瀏覽
添加回答
舉報(bào)