PDO —— PHP 數(shù)據(jù)對象(PHP Data Object)的縮寫,作為一個為多種數(shù)據(jù)庫提供統(tǒng)一的連接接口的方式PDO底層需要配合對應(yīng)數(shù)據(jù)庫的PDO數(shù)據(jù)驅(qū)動來操作數(shù)據(jù)庫。PDO是當(dāng)今PHP官方推薦的數(shù)據(jù)庫連接方式,其優(yōu)勢在于:
1、PDO 真正的以底層實現(xiàn)的統(tǒng)一接口數(shù)庫操作接口,不管后端使用的是何種數(shù)據(jù)庫,如果代碼封裝好了以后,應(yīng)用層調(diào)用基本上差不多的,當(dāng)后端數(shù)據(jù)庫更換了以后,應(yīng)用層代碼基本不用修改.(推薦學(xué)習(xí):PHP編程從入門到精通)
2、PDO 支持更高級的 DB 特性操作,如:存儲過程的調(diào)度等, mysql 原生庫是不支持的.
3、PDO 是 PHP 官方的 PECL 庫,兼容性穩(wěn)定性必然要高于 MySQL Extension,可以直接使用 pecl upgrade pdo 命令升級.
4、PDO 可以防止 SQL 注入,確保數(shù)據(jù)庫更加安全 PDO 防止 SQL 注入的原理
在 PHP 5.1.0 之后 PDO 默認(rèn)開啟狀態(tài) 你可以通過 phpinfo()函數(shù)來查看 PDO 的開啟狀態(tài):
PDO 預(yù)處理
當(dāng)我們使用數(shù)據(jù)庫執(zhí)行查詢時,數(shù)據(jù)庫管理系統(tǒng)( DBMS )會對查詢進(jìn)行編譯,優(yōu)化查詢,而使用 PDO 預(yù)處理可以使這個過程只在首次查詢的時候進(jìn)行,在后續(xù)的相同的查詢只需要對綁定的參數(shù)進(jìn)行替換,這樣就節(jié)省了重復(fù)編譯的時間,另外使用 PDO 參數(shù)綁定還可以避免 SQL 注入等安全性問題。
代碼演示:
<?phptry{ $dbh=new PDO('mysql:host=localhost;dbname=testDB','root',''); $stmt=$dbh->prepare("INSERT users (user_name,sex) VALUES (:user_name,:sex)"); $stmt->bindParam(':user_name',$name); $stmt->bindParam(":sex",$sex); //插入一行 $name="yang001"; $sex="M"; $stmt->execute(); //再次插入一行 $name="yang002"; $sex="F"; $stmt->execute(); }catch (PDOException $e){ print "Error ! : ".$e->getMessage(); die(); }
查看數(shù)據(jù)庫結(jié)果如下:
我們使用預(yù)處理的查詢語句來取出結(jié)果:
<?phptry{ $dbh=new PDO('mysql:host=localhost;dbname=testDB','root',''); $stmt=$dbh->prepare("SELECT * FROM users WHERE user_name=:user_name "); $stmt->bindParam(':user_name',$name); //插入一行 $name="yang001"; if($stmt->execute()){ while ($row=$stmt->fetch(PDO::FETCH_ASSOC)){ print_r($row); } } }catch (PDOException $e){ print "Error ! : ".$e->getMessage(); die(); }
結(jié)果如下: