2012-07-08 55 views
1

PHP手冊狀態如下:正在使用PDO :: prepare()和PDOStatement :: execute()正確選項進行單個查詢嗎?

調用PDO ::準備()和PDOStatement對象::執行()的語句 將使用不同的參數來多次發出值 優化您的應用程序的通過性能允許驅動程序 協商查詢計劃和元數據信息的客戶端和/或服務器端緩存,並有助於防止通過 刪除SQL注入攻擊,從而無需手動引用參數。

PHP PDO::prepare

對於單一,一旦網頁查詢 - 說:

$query = "SELECT id, content FROM pages WHERE id = :id LIMIT 1"; 

是用準備和執行,如:

$statement = $connection->prepare($query); 
$statement->execute(array(":id" => 5)); 

去的最好方法?我從手冊中得到一種感覺,我應該只使用prepare()來進行多次綁定的查詢。如果是這樣的話,還有什麼其他的選擇? (手動調用報價,然後可能是PDO :: query()?)

+0

http://www.php.net/manual/en/pdo.prepare.php查看示例。它在那裏解釋你在問什麼。 – Samson 2012-07-08 08:57:26

+0

手冊中的示例#1和示例#2都顯示多個查詢的情況,即它們執行多次(在這些示例中它是紅色水果和黃色水果)。我正在談論一個單一的查詢。乾杯 – Chris 2012-07-08 10:44:46

回答

1

我不能說在使用預處理語句僅用於單個查詢時是否存在任何性能影響。

每個查詢都被解析,分析和優化。這也適用於PDO:query()(和mysql_*,mysqli_*,...)。準備好的語句 - 簡單地說 - 從執行查詢中分離解析,分析,優化和查詢計劃。我的(可能令人生厭的)假設是,唯一的開銷準備statmenets構成一個單一的查詢是準備結果的緩存。儘管如此,使用一個API執行查詢應該超過輕微的性能損失。如果您針對單個查詢使用PDO::query()而不是PDO::prepare(),那麼您將錯過參數綁定並自動跳過prepare()開箱即用。這可能會打開一個新的蠕蟲罐,如果你忘記了PDO::quote()你的數據。

我只使用PDO::query()來處理不能以合理方式準備的事物(例如,「靜態」查詢,如SELECT foo FROM bar ORDER BY bla DESC LIMIT 1和大量使用IN()等查詢)。

相關問題