2016-09-18 30 views
1

我最近發現ATTR_EMULATE_PREPARES默認在PHP中設置爲true。本次論壇包含了幾個帖子,其建議設置ATTR_EMULATE_PREPARES爲false,所以這就是我決定做:如何在ATTR_EMULATE_PREPARES關閉時模擬PDO中的DEFAULT參數?

$this->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);

這是一個簡單的變化,並沒有存在於系統中的SQL查詢應該受到影響通過設置這個屬性。畢竟,在查詢SELECT column1, column2 FROM table WHERE column3 = ?中,如果參數是由MySQL服務器解釋的實際參數或由PDO提供的(轉義)值替換,則查詢結果無關緊要。

但是,今天我遇到了一個奇怪的錯誤。我有一個查詢ALTER TABLE table ADD COLUMN column INT NULL DEFAULT ?突然失敗後設置標誌不模擬查詢參數。

我懷疑,由於某種原因,DEFAULT值不能是一個參數;它必須是硬編碼值。因此,當PDO模擬一條語句時,MySQL服務器會收到一個查詢,但不會注意到DEFAULT的值最初是一個參數而不是硬編碼的值。如果沒有模擬,MySQL服務器會拋出語法錯誤,因爲它不支持DEFAULT參數值。

所以我的問題是:是否有可能讓PDO 不是模擬查詢語句,但只模擬DEFAULT值?或者,我應該在創建包含DEFAULT子句的數據庫模式調整查詢時自己嘗試這種模擬?

或者我應該簡單地再次打開ATTR_EMULATE_PREPARES只是爲了避免錯誤?

+0

什麼是具體的錯誤信息?是的,MySQL對哪些語句允許參數化有一些限制。表聲明並不真正適用於值綁定和表達式(很像'LIKE'子句)。 – mario

+0

@mario錯誤信息是關於語法無效的,因爲查詢中的'?'字符不明白(當語句沒有準備好時)。 – user2180613

回答

0

不,沒有這樣的方式。

如果您嚴格希望保持模擬模式關閉,那麼在執行數據修改查詢和其他數據庫不支持預準備語句的語句時,您可以暫時恢復其狀態。執行此特定查詢後,將仿真模式恢復爲關閉狀態。

或者您可以永久保持仿真模式。這裏唯一的不便是無法在execute()中綁定LIMIT參數。