很多更成熟的資料庫都支援預處理語句的概念。
什麼是預處理語句?
可以把它看作是想要執行的 sql 的一種編譯過的模板,它可以使用變數引數進行定製。預處理語句可以帶來兩大好處:
• 查詢僅需解析(或預處理)一次,但可以用相同或不同的引數執行多次。當查詢準備好後,資料庫將分析、編譯和優化執行該查詢的計畫。對於複雜的查詢,此過程要花費較長的時間,如果需要以不同引數多次重複相同的查詢,那麼該過程將大大降低應用程式的速度。通過使用預處理語句,可以避免重複分析/編譯/優化週期。簡言之,預處理語句占用更少的資源,因而執行得更快。
• 提供給預處理語句的引數不需要用引號括起來,驅動程式會自動處理。如果應用程式只使用預處理語句,可以確保不會發生sql 注入。(然而,如果查詢的其他部分是由未轉義的輸入來構建的,則仍存在 sql 注入的風險)。
預處理語句如此有用,以至於它們唯一的特性是在驅動程式不支援的時pdo 將模擬處理。這樣可以確保不管資料庫是否具有這樣的功能,都可以確保應用程式可以用相同的資料訪問模式。
例如:
<?php
/** * 我直接針對pdo的封裝類
* user: seven
* date: 2017/7/26
* time: 9:43
*/class mypdo
else
$dsn = ":dbname=;host=;port=;charset=";
$user = $arr['user'];
$password = $arr['password'];
$this->pdo = new pdo($dsn,$user,$password);
}/**
* 銷毀自己的操作類時,同時銷毀被建立了的pdo物件
*/function __destruct()
/*** 執行dml操作語句
* @param $sql 需要執行的sql語句
* @return int 返回執行語句後受到影響的行數
*/public function pdoexec($sql)
/*** 返回結果為陣列結構
* @param $sql 需要執行的sql語句
* @param int $var 執行query函式的引數(可選值:pdo::fetch_both(預設),pdo::fetch_num,pdo::fetch_assoc)
* @return array 將結果轉換為陣列並返回,如果沒有查詢結果則返回乙個空陣列
*/public function arraybypdoquery($sql, $var=pdo::fetch_both)
/*** 獲取查詢結果並封裝為乙個物件陣列
* @param $sql 需要執行的sql語句
* @param string $class_name 建立類的名稱
* @param array $ctor_args 此陣列的元素被傳遞給對應類的建構函式
* @return array 返回組裝好的物件陣列
*/public function objectbypdoquery($sql, $class_name='stdclass', $ctor_args=array())
}return $arr;
}/**
* 使用pdo預編譯語句執行dml操作並返回受影響的行數
* @param $sql 需要執行的sql語句(預編譯語句寫法)
* @param array $arr 預編譯語句需要新增的資料值,陣列結構
* @return int 返回dml執行後受影響的行數
*/public function intbypdoprepare($sql, array $arr=array())
/*** 使用pdo預編譯語句執行查詢操作並返回結果集合
* @param $sql 需要執行的sql語句(預編譯語句寫法)
* @param array $arr 預編譯語句需要新增的資料值,陣列結構
* @return array 轉換為陣列結構的返回值結果
*/public function arraybypdoprepare($sql, array $arr=array())
/*** 獲取查詢結果並封裝為乙個物件陣列
* @param $sql 需要執行的sql語句
* @param array $arr 預編譯語句需要新增的資料值,陣列結構
* @param string $class_name 建立類的名稱
* @param array $ctor_args 此陣列的元素被傳遞給對應類的建構函式
* @return array 返回組裝好的物件陣列
*/public function objectbypdoprepare($sql, array $arr=array(), $class_name='stdclass', $ctor_args=array())
}return $arr;
}}<?php
/** * created by phpstorm.
* user: seven
* date: 2017/7/27
* time: 13:18
*/include_once 'mypdo.class.php';
//include_once 'student.class.php';
$mp = new mypdo();
$*** = 'male';
//$sql = "select * from student where s***=?";
//$arr = $mp->objectbypdoquery($sql, 'student');
//var_dump($arr);
$sql = "insert into student values (null,?,?,?,?,?,?)";
$params = array(
'***','male','xx-xx-xx','***','******xx','******x'
);$num = $mp->intbypdoprepare($sql, $params);
echo $num.'
';$sql = "select * from student where s***=?";
$arr = $mp->objectbypdoprepare($sql,array($***),'student');
var_dump($arr);
php中使用mysql stmt(預處理語句)
預處理語句在某些應用場合中顯得十分高效和靈活,比如在一些重複查詢或批量資料錄入中。但是認識乙個事物的真面孔往往要經歷一番過程,甚至是折磨。尤其對菜鳥們來說,搞清乙個概念或排除乙個故障,往往要好幾個小時甚至好幾天的時間,箇中滋味自是五花八門啊。閒話少說,言歸正傳。本次系統環境是xp,mysql版本5....
mysql預處理語句 MYSQL 預處理語句
一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...
mysql 預處理語句 in MySQL預處理語句
預製語句的sql語法基於三個sql語句 prepare stmt name from preparable stmt execute stmt name using var name var name prepare stmt name prepare語句用於預備乙個語句,並賦予它名稱stmt na...