# PHP MySQL 預處理語句
MySQL 從4.1版本開始提供了一種名為預處理語句(prepared statement)的機制。
MySQL 預處理語句不僅大大減少了需要傳輸?shù)臄?shù)據(jù)量,還提高了命令的處理效率。
預處理語句對于防止 MySQL 注入是非常有用的。
## 預處理語句及綁定參數(shù)
預處理語句用于執(zhí)行多個相同的 SQL 語句,并且執(zhí)行效率更高。
預處理語句的工作原理如下:
預處理:創(chuàng)建 SQL 語句模板并發(fā)送到數(shù)據(jù)庫。預留的值使用參數(shù) "?" 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
數(shù)據(jù)庫解析,編譯,對SQL語句模板執(zhí)行查詢優(yōu)化,并存儲結果不輸出
執(zhí)行:最后,將應用綁定的值傳遞給參數(shù)("?" 標記),數(shù)據(jù)庫執(zhí)行語句。應用可以多次執(zhí)行語句,如果參數(shù)的值不一樣。
相比于直接執(zhí)行SQL語句,預處理語句有兩個主要優(yōu)點:
預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執(zhí)行)
綁定參數(shù)減少了服務器帶寬,你只需要發(fā)送查詢的參數(shù),而不是整個語句
預處理語句針對SQL注入是非常有用的,因為 參數(shù)值發(fā)送后使用不同的協(xié)議,保證了數(shù)據(jù)的合法性。
## MySQLi 預處理語句
```php
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 設置參數(shù)并執(zhí)行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
```
## PDO 中的預處理語句
```php
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 設置 PDO 錯誤模式為異常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 預處理 SQL 并綁定參數(shù)
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 插入行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
// 插入其他行
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
// 插入其他行
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
```
- 簡介
- 數(shù)據(jù)庫
- 數(shù)據(jù)表
- 創(chuàng)建數(shù)據(jù)表
- 查看數(shù)據(jù)表結構
- 修改數(shù)據(jù)表
- 刪除數(shù)據(jù)表
- 查詢數(shù)據(jù)
- 表單查詢
- 聚合查詢
- 鏈接查詢
- 子查詢
- 聯(lián)合查詢
- 正則查詢
- 數(shù)據(jù)管理
- 數(shù)據(jù)類型
- 添加數(shù)據(jù)
- 更新數(shù)據(jù)
- 刪除數(shù)據(jù)
- 索引
- 索引分類
- 設計原則
- 添加索引
- 查看索引
- 刪除索引
- 視圖
- 視圖操作
- 視圖應用
- 事務
- 觸發(fā)器
- 存儲過程和函數(shù)
- 變量
- 異常處理
- 光標
- 流程控制
- 存儲過程
- 自定義函數(shù)
- 內置函數(shù)
- 數(shù)學
- 字符串
- 日期和時間
- 條件判斷
- 系統(tǒng)信息
- 加/解密
- 其他
- 用戶管理
- 登錄和退出
- 新建用戶
- 刪除用戶
- 修改用戶
- 找回ROOT密碼
- 權限管理
- 備份恢復
- 備份數(shù)據(jù)
- 恢復數(shù)據(jù)
- 日志
- 二進制日志
- 錯誤日志
- 查詢日志
- 慢查詢日志
- 性能優(yōu)化
- 優(yōu)化查詢語句
- 優(yōu)化數(shù)據(jù)庫結構
- 優(yōu)化服務器
- 主從復制
- WIN系統(tǒng)主從復制
- Linux單機主從復制
- Linux聯(lián)機主從復制
- 參數(shù)配置
- 日常管理和維護
- 切換主從服務器
- PHP操作
- 連接
- 創(chuàng)建數(shù)據(jù)庫
- 插入數(shù)據(jù)
- 插入多條數(shù)據(jù)
- 預處理語句
- 查詢數(shù)據(jù)
- 預處理語句
- 實戰(zhàn)應用
- 分表
