在進(jìn)度落后的項(xiàng)目中增加人手只會(huì)導(dǎo)致進(jìn)度更加落后纸肉。
----Fred Brooks
什么是PDO溺欧?
PDO全稱Php Data Object(php數(shù)據(jù)對(duì)象),他是一個(gè)支持豐富數(shù)據(jù)庫的訪問接口柏肪,也就是說姐刁,有了PDO,我們不必要使用php提供的相關(guān)函數(shù)來訪問數(shù)據(jù)庫烦味,而是通過PDO提供的接口來訪問
PDO的特點(diǎn)
- PDO是一個(gè)數(shù)據(jù)庫訪問抽象層聂使,作用是統(tǒng)一各種數(shù)據(jù)庫的訪問接口,PDO相比其他方式來說更高效谬俄。
- PDO通過輕巧柏靶,清晰,方便的函數(shù)溃论,統(tǒng)一數(shù)據(jù)庫操作
- PDO吸取數(shù)據(jù)庫交互的教訓(xùn)屎蜓,結(jié)合Php5的新特性,來進(jìn)行方便的數(shù)據(jù)庫操作
- PDO是模塊化的蔬芥,能夠在需要的時(shí)候?yàn)橛脩魯?shù)據(jù)庫后端加載驅(qū)動(dòng)程序梆靖,而不必重新編譯或安裝整個(gè)應(yīng)用程序
下面我們直接進(jìn)行pdo的使用(注意這里我用的新版的php控汉,所以默認(rèn)為開啟狀態(tài)笔诵,否則需要更改配置php.ini),具體的配置情況我們可以通過phpinfo()查看
鏈接數(shù)據(jù)庫
//數(shù)據(jù)庫種類
$dbms = 'mysql';
//數(shù)據(jù)庫名
$dbname = "surine";
//主機(jī)
$host = 'localhost';
//配置dsn參數(shù)(可以看到格式比較奇怪)
$dsn = "$dbms:host=$host;dbname = $dbname";
try {
//進(jìn)行鏈接
$pdo = new PDO($dsn, "root", "");
echo "MySql鏈接成功";
} catch (Exception $e) {
echo "錯(cuò)誤日志".$e->getMessage();
}
這里PDO構(gòu)造是接受4個(gè)參數(shù)姑子,第4個(gè)是訪問配置選項(xiàng)乎婿,暫時(shí)不考慮
SQL語句
PDO中可以通過3種方法來執(zhí)行SQL語句
1.exec()
通過這個(gè)函數(shù)來執(zhí)行一些語句,來實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作
try {
$pdo = new PDO('mysql:host=localhost;dbname=surine', "root", "");
echo "MySql鏈接成功";
$aff = $pdo->exec("delete from users WHERE user = '1'");
echo "輸出數(shù)據(jù)街佑,影響行數(shù)".$aff;
} catch (Exception $e) {
echo "錯(cuò)誤日志".$e->getMessage();
}
這里細(xì)心的讀者會(huì)發(fā)現(xiàn)我修改了連接方式谢翎,采用 直接寫語句的方式把數(shù)據(jù)庫種類捍靠,主機(jī)名稱等傳進(jìn)去,這是因?yàn)槿绻贿@么寫可能出現(xiàn)找不到數(shù)據(jù)庫的情況森逮,那么當(dāng)然我們的數(shù)據(jù)也就沒法操作了榨婆,如果你遇到顯示不了數(shù)據(jù)的情況,可以采用這種寫法褒侧,如果不行良风,可以使用
$pdo->errorInfo()
這個(gè)方法來檢查錯(cuò)誤信息
再比如說,插入數(shù)據(jù)
$aff = $pdo->exec("insert into users(user,pswd) values('mt','123456')");
2.query()
query方法返回執(zhí)行結(jié)果后的PDO結(jié)果集闷供,那么他的參數(shù)也是一個(gè)sql語句烟央,下面我們演示一下訪問表的例子
$query="select * from users";//需要執(zhí)行的sql語句
$arr = $pdo->query($query)->fetchAll();
foreach ($arr as $var){
echo "賬號(hào)".$var['user'];
echo "密碼".$var['pswd']."<br>";
}
那么我們可以看到,我們用 $pdo->query($query)查詢數(shù)據(jù)歪脏,并且使用fetchAll方法疑俭,將查詢到的數(shù)據(jù)轉(zhuǎn)化格式,最后使用foreach語句進(jìn)行打印
3.prepare()和execute()
這是PDO的預(yù)處理語句里包含的方法婿失,首先通過prepare()方法查詢準(zhǔn)備工作钞艇,通過execute來執(zhí)行查詢,下面是一個(gè)演示
$query="select * from users";//需要執(zhí)行的sql語句
$res=$pdo->prepare($query);//準(zhǔn)備查詢語句
$res->execute();
$result=$res->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $var){
echo "賬號(hào)".$var['user'];
echo "密碼".$var['pswd']."<br>";
}
這樣的打印結(jié)果和上面的一致
4.fetch() 豪硅, fetchAll()
終于說到fetch這里了香璃,在前面用到很多次fetchAll方法
fetch()方法用于獲取結(jié)果集里的下一行
那么fetchAll就是所有行,他們的返回值是一個(gè)array
這里還有一個(gè)fetchColumn()方法舟误,是獲取某一行葡秒,那么傳入的參數(shù)就是一個(gè)int值
錯(cuò)誤處理
我們使用errorcode()方法獲取錯(cuò)誤碼,也可以使用errorInfo()方法獲取詳細(xì)信息嵌溢,通過這些信息眯牧,我們可以得到,代碼出現(xiàn)了什么錯(cuò)誤赖草。
事務(wù)處理
事務(wù)是保證操作正確進(jìn)行的一大解決方法学少,那么PDO也是支持事務(wù)的。那么事務(wù)分為幾個(gè)部分秧骑。
//開啟事務(wù)
$pdo->beginTransaction();
//提交事務(wù)
$pdo->commit();
//事務(wù)回滾
$pdo->rollBack();
那么比如說我們添加一條信息到數(shù)據(jù)庫版确,如果添加失敗,防止其產(chǎn)生影響乎折,那么我們可以用回滾來撤銷更改绒疗,下面是一個(gè)例子
try {
$pdo = new PDO('mysql:host=localhost;dbname=surine', "root", "");
echo "MySql鏈接成功";
$pdo->beginTransaction(); //開啟事務(wù)
$query="insert users(user,pswd)values('this','this')";//需要執(zhí)行的sql語句
$res=$pdo->prepare($query);//準(zhǔn)備查詢語句
$res->execute();
if($res){
echo "添加數(shù)據(jù)成功";
}else{
echo "添加數(shù)據(jù)失敗";
}
$pdo->commit(); //數(shù)據(jù)提交
} catch (Exception $e) {
$pdo->rollBack(); //數(shù)據(jù)回滾
echo "錯(cuò)誤日志".$e->getMessage();
}
可以看到,我們寫了一個(gè)添加語句骂澄,然后開啟了事務(wù)吓蘑,在執(zhí)行語句后,提交事務(wù),如果發(fā)生問題磨镶,我們?cè)赾atch里也有回滾的操作溃蔫。
總結(jié)
關(guān)于PDO暫時(shí)先記錄這么多,在以后的學(xué)習(xí)中我會(huì)補(bǔ)充更多琳猫。