PDO—數(shù)據(jù)庫抽象層
簡介:PDO擴展為PHP訪問數(shù)據(jù)庫定義了一個輕量級的、一致性的接口,PDO解決了數(shù)據(jù)庫連接不統(tǒng)一的問題。
一、 PDO簡介
本章主要介紹PDO的安裝與配置,以及使用PDO連接數(shù)據(jù)庫的方法。
1-1PDO簡介
PDO是PHP Data Object(PHP數(shù)據(jù)對象)的簡稱,它是與PHP5.1版本一起發(fā)布的,目前支持的數(shù)據(jù)庫包括Firebird、FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite和Sybase。當(dāng)操作不同數(shù)據(jù)庫時,只需要修改PDO中的DSN
(數(shù)據(jù)庫源) ,即可使用PDO的統(tǒng)一接口進行操作。
PDO特性:
編碼一致性:PDO提供可用于各種數(shù)據(jù)庫的單一接口
靈活性:PDO在運行時必須加載數(shù)據(jù)庫驅(qū)動程序,所以不需要每次在使用數(shù)據(jù)庫時,重新配置和重新編譯PHP
高性能:PDO是用C語言編寫的編譯為PHP,與用php編寫的其他方案相比,雖然其他功能相同,但提供了更高的性能
面向?qū)ο筇匦裕篜DO是利用的PHP5面向?qū)ο蟮奶匦裕梢垣@得更高效的數(shù)據(jù)庫通信。
注意:PDO擴展只是一個抽象的接口層,利用PDO擴展本身,并不能實現(xiàn)任何數(shù)據(jù)庫的操作,必須使用一個特性的形式把各自的特色表現(xiàn)出來才行。
1-2 PDO的配置與啟用
1-3 PDO連接數(shù)據(jù)庫
1.通過參數(shù)形式連接數(shù)據(jù)庫(重點掌握此種辦法)
//通過參數(shù)形式連接數(shù)據(jù)庫 try{ $dsn='mysql:host=localhost;dbname=school'; $username='root'; $password='root'; $pdo=new PDO($dsn,$username,$password); var_dump($pdo); }catch (PDOException $e){ echo $e->getMessage(); }; 需要注意:dsn是你的數(shù)據(jù)源 輸出結(jié)果:object(PDO)#1 (0) { }
二、 PDO對象的使用
主要介紹PDO對象方法的使用。
2-1 [PDO] exec()方法執(zhí)行建表操作
<?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //exec():執(zhí)行一條sql語句并返回其受影響的行數(shù);如果沒有受影響的記錄,它返回0 //exec對于select沒有作用 //PHP是一個Web編程語言,在編程過程中難免會遇到用echo來輸出大段的html和javascript腳本的情況, //如果用傳統(tǒng)的輸出方法 ——按字符串輸出的話, //肯定要有大量的轉(zhuǎn)義符來對字符串中的引號等特殊字符進行轉(zhuǎn)義,以免出現(xiàn)語法錯誤。 //如果是一兩處還可以容忍,但是要是一個完整的 html文本或者是一個200行的js我想是誰都會崩潰的。 //這就是PHP為什么要引入一個定界符的原因——至少一大部分原因是這樣的。 /* 1.PHP定界符的作用就是按照原樣,包括換行格式什么的,輸出在其內(nèi)部的東西; 2.在PHP定界符中的任何特殊字符都不需要轉(zhuǎn)義; 3.PHP定界符中的PHP變量會被正常的用其值來替換。 PHP中的定界符格式是這樣的: <<<Eof …… Eof;*/ $sql=<<<EOF create table if not exists t_teacher( id int UNSIGNED auto_increment primary key, teaname varchar(20) not null UNIQUE, pwd char(32) not null, email varchar(30) not null ); EOF; $res= $pdo->exec($sql); var_dump($res); }catch (PDOException $e){ echo $e->getMessage(); };
輸出結(jié)果:int(0);
2-2 [PDO] exec()方法執(zhí)行插入記錄操作
續(xù)上面:插入一條或多條記錄
<?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); $sql='insert into t_teacher values(default,"king5","'.md5('king').'","waly@qq.com");'; $res=$pdo->exec($sql); echo $res; }catch (PDOException $e){ echo $e->getMessage(); };
<?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //$sql='insert into t_teacher values(default,"king6","'.md5('king').'","waly@qq.com");'; $sql=<<<EOF insert into t_teacher values (default,"king7","'.md5('king').'","waly@qq.com"), (default,"king8","'.md5('king').'","waly@qq.com"), (default,"king9","'.md5('king').'","waly@qq.com") EOF; $res=$pdo->exec($sql); echo '受影響的記錄的條數(shù)為:'. $res."<br/>"; //$pdo->lastInsertId():得到新插入記錄的ID號 //echo '最后插入的ID號為:'.$pdo->lastInsertId(); }catch (PDOException $e){ echo $e->getMessage(); };
2-3 [PDO] exec()方法執(zhí)行其他SQL操作
本身是king,修改為king,會是0條記錄被影響.
lastInsertId() 只能對插入有影響。
exec()對查詢無作用
2-4 [PDO] errorCode()和errorInfo()方法查看錯誤信息
<?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //錯誤的表名 $sql='insert into t_teacher1 values(default,"king6","'.md5('king').'","waly@qq.com");'; $res=$pdo->exec($sql); if($res===false){ //$pdo->errorCode(); SQLSTATE的值 echo $pdo->errorCode(); echo '<hr/>'; //$pdo->errorInfo():返回的錯誤信息的數(shù)組,數(shù)組中包含3個單元 //0=>SQLSTATE(錯誤編號),1=>CODE(錯誤碼),2=>INFO(錯誤信息) $errInfo=$pdo->errorInfo(); print_r($errInfo); } }catch (PDOException $e){ echo $e->getMessage(); };
2-5 [PDO] query()方法執(zhí)行查詢語句
<?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //查詢一條記錄 //$sql='select * from t_teacher where id=5'; //查詢多條記錄 $sql='select * from t_teacher'; //$pdo->query($sql):執(zhí)行sql語句,返回PDOStatement對象:需要遍歷這個對象,將里面的內(nèi)容取出來 $stmt=$pdo->query($sql); var_dump($stmt); //只能看出這個語句返回的是一個對象 echo '<hr/>'; foreach ($stmt as $row){ print_r($row); echo '<hr/>'; echo '編號:'.$row['id'].'<br/>'; echo '用戶名:'.$row['teaname'].'<br/>'; echo '郵箱:'.$row['email'].'<br/>'; echo '<hr/>'; } }catch (PDOException $e){ echo $e->getMessage(); };
Query()用于插入數(shù)據(jù) <?php try{ //驅(qū)動器的名稱 mysql $pdo=new PDO('mysql:host=localhost;dbname=school','root','root'); //插入一條記錄 $sql='insert into t_teacher values(default,"king12","'.md5('king').'","waly@qq.com");'; //$pdo->query($sql):執(zhí)行sql語句,返回PDOStatement對象:需要遍歷這個對象,將里面的內(nèi)容取出來 $stmt=$pdo->query($sql); var_dump($stmt); //只能看出這個語句返回的是一個對象 }catch (PDOException $e){ echo $e->getMessage(); };
注意: