PHP的預處理語句的使用

2021-08-04 16:03:27 字數 3348 閱讀 4345

很多更成熟的資料庫都支援預處理語句的概念。

什麼是預處理語句?

可以把它看作是想要執行的 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...