在進(jìn)度落后的項目中增加人手只會導(dǎo)致進(jìn)度更加落后。
----Fred Brooks
什么是PDO?
PDO全稱Php Data Object(php數(shù)據(jù)對象),他是一個支持豐富數(shù)據(jù)庫的訪問接口,也就是說,有了PDO,我們不必要使用php提供的相關(guān)函數(shù)來訪問數(shù)據(jù)庫,而是通過PDO提供的接口來訪問
PDO的特點
- PDO是一個數(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ù)據(jù)庫后端加載驅(qū)動程序,而不必重新編譯或安裝整個應(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 "錯誤日志".$e->getMessage();
}
這里PDO構(gòu)造是接受4個參數(shù),第4個是訪問配置選項,暫時不考慮
SQL語句
PDO中可以通過3種方法來執(zhí)行SQL語句
1.exec()
通過這個函數(shù)來執(zhí)行一些語句,來實現(xiàn)對數(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 "錯誤日志".$e->getMessage();
}
這里細(xì)心的讀者會發(fā)現(xiàn)我修改了連接方式,采用 直接寫語句的方式把數(shù)據(jù)庫種類,主機(jī)名稱等傳進(jìn)去,這是因為如果不這么寫可能出現(xiàn)找不到數(shù)據(jù)庫的情況,那么當(dāng)然我們的數(shù)據(jù)也就沒法操作了,如果你遇到顯示不了數(shù)據(jù)的情況,可以采用這種寫法,如果不行,可以使用
$pdo->errorInfo()
這個方法來檢查錯誤信息
再比如說,插入數(shù)據(jù)
$aff = $pdo->exec("insert into users(user,pswd) values('mt','123456')");
2.query()
query方法返回執(zhí)行結(jié)果后的PDO結(jié)果集,那么他的參數(shù)也是一個sql語句,下面我們演示一下訪問表的例子
$query="select * from users";//需要執(zhí)行的sql語句
$arr = $pdo->query($query)->fetchAll();
foreach ($arr as $var){
echo "賬號".$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í)行查詢,下面是一個演示
$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 "賬號".$var['user'];
echo "密碼".$var['pswd']."<br>";
}
這樣的打印結(jié)果和上面的一致
4.fetch() , fetchAll()
終于說到fetch這里了,在前面用到很多次fetchAll方法
fetch()方法用于獲取結(jié)果集里的下一行
那么fetchAll就是所有行,他們的返回值是一個array
這里還有一個fetchColumn()方法,是獲取某一行,那么傳入的參數(shù)就是一個int值
錯誤處理
我們使用errorcode()方法獲取錯誤碼,也可以使用errorInfo()方法獲取詳細(xì)信息,通過這些信息,我們可以得到,代碼出現(xiàn)了什么錯誤。
事務(wù)處理
事務(wù)是保證操作正確進(jìn)行的一大解決方法,那么PDO也是支持事務(wù)的。那么事務(wù)分為幾個部分。
//開啟事務(wù)
$pdo->beginTransaction();
//提交事務(wù)
$pdo->commit();
//事務(wù)回滾
$pdo->rollBack();
那么比如說我們添加一條信息到數(shù)據(jù)庫,如果添加失敗,防止其產(chǎn)生影響,那么我們可以用回滾來撤銷更改,下面是一個例子
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 "錯誤日志".$e->getMessage();
}
可以看到,我們寫了一個添加語句,然后開啟了事務(wù),在執(zhí)行語句后,提交事務(wù),如果發(fā)生問題,我們在catch里也有回滾的操作。
總結(jié)
關(guān)于PDO暫時先記錄這么多,在以后的學(xué)習(xí)中我會補(bǔ)充更多。