Lidemy / mentor-program-2nd-futianshen

mentor-program-2nd-futianshen created by GitHub Classroom
14 stars 2 forks source link

How to use Prepare Statements in PHP #14

Open futianshen opened 5 years ago

futianshen commented 5 years ago

Prepare Statement

為什麼要使用 Prepare Statement?

Prepare Statement 的原理?

建立一個可以重複使用的 SQL 模板,引入參數,提供參數化查詢 [1]。

如何使用 Prepare Statement?

  1. Prepare 準備模板
  2. Bound Parameters 綁定參數(如果沒有參數需要綁定這一步可以省略)
  3. Execute 執行SQL
  4. Get Result 獲得執行結果
$read_user = $conn->prepare("SELECT users.id, users.nickname FROM certificates 
LEFT JOIN users ON users.id = certificates.user_id 
WHERE certificates.id =? AND certificates.is_deleted=? "); //1. 準備模板:將 SQL 指令的原來要放變數的地方用 ? 代替
$read_user->bind_param("si", $session_id, 0); //2. 綁定參數:指定變數型別綁定參數
$read_user->execute(); //3. 執行SQL:執行綁定參數的 SQL 指令
$read_user_result = $read_user->get_result(); //4. 獲得執行結果
$read_user_row = $read_user_result->fetch_assoc();

為什麼 Prepare Statement 可以預防 SQL injection?

利用參數化查詢過程,會將字串轉換成非字串型別的特性,來阻絕惡意 SQL 指令的執行。

註解

[1] 參數化查詢
在存取或改變資料庫資料時,在需要填入「資料」的地方,使用參數(Parameter)來給值。

參考資料

參數化查詢 Wikipedia

PHP Prepared Statements W3Schools

Prepared Statements PHP Documentation