PDO(PHP Data Object)機(jī)制防御sql注入,這是因?yàn)椴荒苁褂肞DO擴(kuò)展本身執(zhí)行任何數(shù)據(jù)庫(kù)操作肾扰,而sql注入的關(guān)鍵就是通過(guò)破壞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中的查詢(xún)操作:exec/query/prepared statement
1)PDO::exec()一般用于執(zhí)行一次的SQL語(yǔ)句膊夹,返回受查詢(xún)影響的行數(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í)例部分,為了得到查詢(xún)數(shù)據(jù)的總量掉分,就用了PDO::query()語(yǔ)句俭缓。
(3)PDOStatement表示一個(gè)prepared statement語(yǔ)句克伊,而在執(zhí)行之后,又將返回一組關(guān)聯(lián)數(shù)組的結(jié)果华坦。如果一類(lèi)查詢(xún)(查詢(xún)結(jié)構(gòu)相似而具體的參數(shù)不一)需要一次解析而執(zhí)行使用很多次愿吹,可以先用prepared statement,這樣可以為具體的查詢(xún)的執(zhí)行做好準(zhǔn)備惜姐,避免了分析犁跪、編譯、優(yōu)化的循環(huán)歹袁,將減少資源占用率坷衍,從而提高運(yùn)行效率。通過(guò)對(duì)數(shù)據(jù)庫(kù)進(jìn)行prepare操作条舔,便會(huì)返回PDOStatement數(shù)據(jù)類(lèi)型枫耳,從而在其基礎(chǔ)上展開(kāi)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);
//用名稱(chēng)傳入?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));
//用名稱(chēng)傳入?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));