簡體   English   中英

PDO,Mysql和本機准備語句

[英]PDO, Mysql and native prepared statements

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

實際上,MySQL PDO驅動程序的PHP手冊頁說明了很多。 http://php.net/manual/zh/ref.pdo-mysql.php

但是,在另一個SO問題上,我在幫助如何用數組元素替換char的所有出現? ,有人評論說這是不正確的,事實上,PDO在與MySQL數據庫對話時會模擬准備好的語句。

我沒有太多運氣找到證據來支持提出的聲明,但是我確實發現有一個PDO :: ATTR_EMULATE_PREPARES屬性可以配置為切換准備好的語句仿真。

那么事情的真相是什么? PDO真的不與mysql一起使用准備好的語句嗎? 如果不是,是否可以強迫這樣做?如果這樣做,您應該這樣做嗎? 我一直認為,正如手冊中所聲稱的那樣,由於mysql具有PDO將使用它們的真正准備好的語句。 手冊不正確嗎?

編輯 :最近我閱讀了幾篇文章,至少對合理地禁用實際准備好的查詢為何提供了合理的理由。 PHP腳本的生存期很短,只能運行很長時間才能生成對請求的響應,然后將其所有資源釋放。 對於任何查詢,每個請求僅執行一次,實際上您必須執行2條SQL命令(prepare命令和execute命令),因此對於僅執行一次的任何Prepared語句,您實際上可能會獲得比模擬結果稍差的性能。准備好的聲明。 對於必須在循環中運行的查詢,實際的預准備語句可能會更好地執行,但是這種情況在通常用於PHP的請求/響應模型中相對較少。

我仍然認為最好使用真正的預備語句,但至少我對PDO為什么默認使用模擬查詢有一個合理的解釋。

PDO真的不與mysql一起使用准備好的語句嗎?

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

如果沒有,是否可以強迫這樣做

通過使用PDO::ATTR_EMULATE_PREPARES設置,該名稱非常不言自明。

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

你應該那樣做嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM