PDO(PHP Data Object)機(jī)制防御sql注入,這是因?yàn)椴荒苁褂肞DO擴(kuò)展本身執(zhí)行任何數(shù)據(jù)庫(kù)操作,而sql注入的關(guān)鍵就是通過破壞sql語(yǔ)句結(jié)構(gòu)執(zhí)行惡意的sql命令。
PDO庫(kù)中定義了一些靜態(tài)常量,這些常量用PDO :: <NAME>的方式進(jìn)行調(diào)用。比如在prepare()語(yǔ)句中經(jīng)常這樣使用:
$query=$db->prepare('select * from book where cat_id=:id limit :offset, :limit', array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
PDO中的連接和連接管理
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
PDO中的查詢操作:exec/query/prepared statement
1)PDO::exec()一般用于執(zhí)行一次的SQL語(yǔ)句,返回受查詢影響的行數(shù)。它不適用于SELECT語(yǔ)句,如果需要用一次是SELECT語(yǔ)句,可以用PDO::query();也不適用于多次使用的語(yǔ)句,如果有多次使用的需求,考慮用PDO::prepare()。
(2)PDO::query()用于執(zhí)行一次SELECT語(yǔ)句,執(zhí)行后應(yīng)當(dāng)隨即使用PDOStatement::fetch()語(yǔ)句將結(jié)果取出,否則立即進(jìn)行下一次的PDO::query()將會(huì)報(bào)錯(cuò)。在2.PDO實(shí)例部分,為了得到查詢數(shù)據(jù)的總量,就用了PDO::query()語(yǔ)句。
(3)PDOStatement表示一個(gè)prepared statement語(yǔ)句,而在執(zhí)行之后,又將返回一組關(guān)聯(lián)數(shù)組的結(jié)果。如果一類查詢(查詢結(jié)構(gòu)相似而具體的參數(shù)不一)需要一次解析而執(zhí)行使用很多次,可以先用prepared statement,這樣可以為具體的查詢的執(zhí)行做好準(zhǔn)備,避免了分析、編譯、優(yōu)化的循環(huán),將減少資源占用率,從而提高運(yùn)行效率。通過對(duì)數(shù)據(jù)庫(kù)進(jìn)行prepare操作,便會(huì)返回PDOStatement數(shù)據(jù)類型,從而在其基礎(chǔ)上展開execute、fetch等進(jìn)一步的操作。
prepare特殊使用
//用位置參入?yún)?shù)
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
//用名稱傳入?yún)?shù)
$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();
/////////////////////////////////////////////
//也可以這樣實(shí)現(xiàn)
//用位置參入?yún)?shù),indexed array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$name = 'one';
$value = 1;
$stmt->execute(array($name,$value));
//用名稱傳入?yún)?shù), associated array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$name = 'one';
$value = 1;
$stmt->execute(array(':name'=>$name,':value'=>$value));