許多成熟的數據庫都支持預處理語句(Prepared Statements)的概念。它們是什麼東西?php
你能夠把它們想成是一種編譯過的要執行的SQL語句模板,可使用不一樣的變量參數定製它。數據庫
預處理語句具備兩個主要的優勢:框架
正由於預處理語句是如此有用,它成了PDO惟一爲不支持此特性的數據庫提供的模擬實現。fetch
這使你可使用統一的數據訪問規範而沒必要關心數據庫自己是否具有此特性。優化
/* 使用預處理語句重複插入數據(1) 此示例演示了一個經過向命名佔位符代入一個name和一個value值來執行的INSERT查詢 */ $stmt= $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); //插入一行 $name= 'one'; $value= 1; $stmt->execute();//使用不一樣的值插入另外一行 $name= 'two'; $value= 2; $stmt->execute(); /* 使用預處理語句重複插入數據(2) 此示例演示了一個經過向用?表示的佔位符代入一個name和一個value值來執行的INSERT查詢 */ $stmt= $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name= 'one'; $value= 1; $stmt->execute(); // 使用不一樣的值插入另外一行 $name= 'two'; $value= 2; $stmt->execute(); /* 經過預處理語句獲取數據 此示例演示使用從表單獲取的數據爲關鍵值來執行查詢獲取數據。用戶的輸入會被自動添加引號,因此這兒不存在SQL注入攻擊的危險。 */ $stmt= $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if($stmt->execute(array($_GET['name']))) { while($row= $stmt->fetch()) { print_r($row); } }
其實主流的PHP框架都支持Prepared Statements,並且要簡單不少。下面是ThinkPHP模型支持的例子:.net
// 實例化User模型 $model= D('User'); // 定義預處理傳入數據 $data['username'] = 'deeka'; $data['password'] = '123456'; // 數據預處理 if($model->create($data)){ $model->add(); }