## 預處理語句
什么是預處理語句?可以把它看作是想要運行的 SQL 的一種編譯過的模板,它可以使用變量參數進行定制。
預處理語句可的兩大好處:
* 查詢僅需解析一次,但可以用相同或不同的參數執行多次。當查詢準備好后,數據庫將分析、編譯和優化執行該查詢的計劃。對于復雜的查詢,此過程要花費較長的時間,如果需要以不同參數多次重復相同的查詢,那么該過程將大大降低應用程序的速度。通過使用預處理語句,可以避免重復分析/編譯/優化周期。
* 提供給預處理語句的參數不需要用引號括起來,驅動程序會自動處理。如果應用程序只使用預處理語句,可以確保不會發生SQL 注入。(然而,如果查詢的其他部分是由未轉義的輸入來構建的,則仍存在 SQL 注入的風險)。
PDOStatement 對象常用的方法:
* PDOStatement::bindColumn — 綁定一列到一個 PHP 變量
* PDOStatement::bindParam — 綁定一個參數到指定的變量名(**引用傳遞**)
* PDOStatement::bindValue — 把一個值綁定到一個參數(**只讀傳遞**)
* PDOStatement::closeCursor — 關閉游標,使語句能再次被執行。
* PDOStatement::columnCount — 返回結果集中的列數
* PDOStatement::debugDumpParams — 打印一條 SQL 預處理命令
* PDOStatement::errorCode — 獲取跟上一次語句句柄操作相關的 SQLSTATE
* PDOStatement::errorInfo — 獲取跟上一次語句句柄操作相關的擴展錯誤信息
* PDOStatement::execute — 執行一條預處理語句
* PDOStatement::fetch — 從結果集中獲取下一行
* PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組
* PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。
* PDOStatement::fetchObject — 獲取下一行并作為一個對象返回。
* PDOStatement::getAttribute — 檢索一個語句屬性
* PDOStatement::getColumnMeta — 返回結果集中一列的元數據
* PDOStatement::nextRowset — 在一個多行集語句句柄中推進到下一個行集
* PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數
* PDOStatement::setAttribute — 設置一個語句屬性
* PDOStatement::setFetchMode — 為語句設置默認的獲取模式。
參考鏈接: [PDOStatement 對象](http://php.net/manual/zh/class.pdostatement.php)
```
<?php
$pdo = new PDO('mysql:host=localhost;dbname=koogua_forum', 'root', '123456');
/* ------------- 插入操作 ------------- */
// 使用命名占位符
$name = 'foo';
$about = 'I am foo';
$stmt = $pdo->prepare("INSERT INTO Tag (name, about) VALUES (:name, :about)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':about', $about, PDO::PARAM_STR);
$stmt->execute();
// 使用問號占位符
$name = 'bar';
$about = 'I am bar';
$stmt = $pdo->prepare("INSERT INTO Tag (name, about) VALUES (?, ?)");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $about, PDO::PARAM_STR);
$stmt->execute();
/* ------------- 更新操作 ------------- */
$name = 'php5';
$about = 'I am php5';
$id = 1;
$stmt = $pdo->prepare("UPDATE Tag SET name = :name, about = :about WHERE id = :id");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':about', $about, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
/* ------------- 刪除操作 ------------- */
$id = 8;
$sql = "DELETE FROM Tag WHERE id = :id";
$stms = $pdo->prepare($sql);
$stms->bindValue(':id', $id, PDO::PARAM_INT);
$stms->execute();
/* ------------- 查詢操作 ------------- */
$sql = "SELECT * FROM Tag WHERE id > :id";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':id', 3, PDO::PARAM_INT);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
echo "name:{$row->name}, about:{$row->about}" .PHP_EOL;
}
$stmt->closeCursor();
echo "--- rows begin with php ---" . PHP_EOL;
$sql = "SELECT * FROM Tag WHERE name LIKE :name";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', 'php%', PDO::PARAM_STR);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
echo "name:{$row->name}, about:{$row->about}" .PHP_EOL;
}
?>
```
- 基本語法
- PHP標記
- 指令分隔符
- 從HTML中分離
- 注釋
- 數據類型
- 布爾值
- 整數
- 浮點數
- 字符串
- 數組
- 對象
- 資源
- 空值
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 常量
- 常量語法
- 魔術常量
- 運算符
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 遞增與遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if條件結構
- switch條件結構
- while循環結構
- do-while循環結構
- for循環結構
- foreach循環結構
- 包含文件
- 函數
- 自定義函數
- 可變函數
- 匿名函數
- 遞歸函數
- 類與對象
- 基本概念
- 屬性
- 方法
- 類常量
- 構造函數和析構函數
- 訪問控制
- 繼承
- 抽象類
- 接口
- Trait
- 重載
- 對象遍歷
- 魔術方法
- Final關鍵字
- 命名空間
- 自動加載
- 錯誤處理
- 錯誤顯示
- 錯誤日志
- 錯誤報告
- 自定義錯誤處理
- 異常處理
- 異常處理機制
- 擴展異常處理類
- 字符操作
- 數組操作
- 時間操作
- 表單操作
- GET提交
- POST提交
- 文件上傳
- 會話控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件屬性
- 讀取文件
- 寫入文件
- 文件管理
- 文件鎖
- 目錄處理
- 路徑處理
- 網絡操作
- HTTP協議
- Socket操作
- CURL操作
- PDO操作
- 介紹
- 連接管理
- 預處理語句
- 事務處理
- 錯誤處理
- 圖像操作
- 正則表達式
- 標準推薦
- 包管理器
- 設計模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御