2011-11-28 177 views
7

到目前爲止,我對PDO的理解是,PDO將在真實準備的語句可用的地方使用它,並在不能使用的地方模擬它們。我還了解到,在涉及mysql的情況下,如果您正在與支持它們的mysql版本進行通信,則會使用真實的準備好的語句。PDO,Mysql和本地準備的語句

事實上,MySQL PDO驅動程序的PHP手冊頁也是這麼說的。 http://php.net/manual/en/ref.pdo-mysql.php

但是,在另一個SO問題上,我在How to replace all occurencies of char with elements from array?上提供了幫助,有人提出這樣的說法並非如此,事實上PDO在與MySQL數據庫交談時模擬準備好的語句。

我沒有太多的運氣找到證據來支持那裏的聲明,但我確實發現有一個PDO :: ATTR_EMULATE_PREPARES屬性可以配置爲切換準備好的語句模擬。

所以事情的真相是什麼? PDO是否真的不使用MySQL準備好的語句?如果沒有,是否可以被迫這樣做,如果是的話,你應該這樣做嗎?我一直認爲,正如手冊中所聲稱的,由於mysql具有PDO將使用它們的真實準備語句。手冊是否不準確?

編輯添加:我最近閱讀了一些文章,至少給出了一個合理的理由,說明爲什麼實際準備好的查詢默認是禁用的。 PHP腳本通常是短暫的,只能運行足夠長的時間才能生成對請求的響應,然後解除分配所有資源。對於任何查詢,每個請求只執行一次,你實際上必須執行2條SQL命令(prepare命令和execute命令),因此對於只執行一次的準備好的語句,實際上可能會比仿真的性能稍差準備好聲明。對於必須在循環中運行的查詢,實際準備的語句可能會表現更好,但這種情況在PHP通常用於的請求/響應模型類型中相對較少。

我仍然認爲實際準備好的聲明是可取的,但至少我有一個合理的解釋,爲什麼PDO默認使用模擬查詢。

回答

5

PDO是否真的不使用MySQL準備好的語句?

是的,默認情況下(至少在我測試的版本中),但可以手動打開純模式。

如果沒有,可以把它被迫這樣做

通過採用PDO::ATTR_EMULATE_PREPARES設置,名稱是不言自明。

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

你應該做的?

這是他們所有人中最難的問題。
嗯,我會說 - 是的,你應該。如果您選擇PDO作爲您的數據庫驅動程序,則在仿真模式下使用它沒有意義。

+0

感謝您的回覆。但它確實乞討的問題,但如果它支持它,那麼爲什麼它默認關閉? – GordonM

+0

這是兼容性問題,我相信。 –