2011-03-04 111 views
6

在MySQLi中使用預準備語句有什麼好處?爲什麼MySQLi準備語句?

如果唯一的目的是確保查詢的安全性,那麼使用類似mysqli_real_escape_string的方法清理查詢不是更好,而不是爲每個查詢編寫如此多的代碼行(如prepare,bind_param,execute,close等) ?

+0

執行時間和查詢緩存。 – zzzzBov 2011-03-04 23:08:27

回答

12

準備語句不僅僅是爲了代碼的安全性。它有助於SQL服務器解析您的語句併爲您的查詢生成執行計劃。

如果您運行SELECT 1000次,則SQL服務器將不得不解析,準備並生成有關如何獲取數據1000次的計劃。

如果您準備語句,然後運行準備好的語句,每次使用不同的綁定值1000次,那麼語句只會被解析一次,並且每次都使用相同的查詢計劃。

這不僅有助於您在腳本中運行1,000個查詢,而且如果您只有1條語句並運行腳本1,000次,服務器可以記住計劃服務器端。下一次腳本運行時,它將再次使用相同的計劃。

確定對於一個或兩個查詢看起來可能微不足道,但是當您開始執行大量查詢或重複執行相同的查詢時,您將節省大量處理時間。

9

有幾個優點:

  • 安全 - 你不需要逃避什麼,你只需要綁定的參數。
  • 正確性 - 如果您編寫了WHERE $x = 4,如果$x爲空,您將收到語法錯誤,但WHERE ? = 4將起作用。
  • 性能準備的查詢可以重複使用不同的參數,保存重建字符串,並在服務器上重新解析。
  • 可維護性 - 代碼更容易閱讀。在連接字符串以創建SQL時,很容易混雜很多小的SQL和PHP代碼。使用預準備語句鼓勵您將SQL從確定變量的值中分離出來。