PDO MySQL:利用查詢快取和預先準備語句安全性
MySQL 提供本機預先準備語句和快取查詢以實現最佳化和快取安全。然而,問題出現了:在 PDO 配置中應該優先考慮哪些?
揭穿神話
普遍的看法是:
但是,這些語句可能不適用於最新的 MySQL 和 PHP 版本。
效能與安全性
在效能方面,MySQL 版本 5.1.17 或更高的允許使用準備好的語句進行查詢快取。因此,可以利用較新的 MySQL 和 PHP 版本同時利用效能和安全性。
關於安全性,本機準備好的語句不提供針對 SQL 注入的額外保護。 PDO 已經轉義了查詢參數值,且此流程不受 EMULATE_PREPARES 設定的影響。
錯誤回報
本機準備好的語句在準備過程中會觸發語法錯誤,而模擬準備時語句將此類錯誤推遲到執行時間。這會影響您編寫的程式碼,尤其是使用 PDO::ERRMODE_EXCEPTION 時。
其他注意事項
建議
對於較舊的 MySQL 和 PHP 版本,建議模擬準備好的語句。但是,對於較新的版本,應使用本機準備好的語句(透過關閉模擬)。
自訂PDO 連接函數
以下是PDO 連接的程式碼片段具有最佳設定的功能:
function connect_PDO($settings) { $emulate_prepares_below_version = '5.1.17'; $dsnpairs = []; foreach ($settings as $k => $v) { if ($v !== null) { $dsnpairs[] = "{$k}={$v}"; } } $dsn = 'mysql:'.implode(';', $dsnpairs); $dbh = new PDO($dsn, $settings['user'], $settings['pass']); $serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION); $emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares); return $dbh; }
透過利用此功能或根據您的特定偏好進行自訂,您可以在效能之間實現理想的平衡以及PDO 連接的安全性。
以上是PDO MySQL:準備語句還是查詢快取?您應該優先考慮哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!