資料庫抽象層

資料庫抽象層

目前,在PHP的網站及眾多書籍中,很少講到資料庫抽象層,有的PHP開發者雖然已做了幾年開發工作,但似乎也沒有意識到它的存在。很多人並不理解數據抽象的重要性,也不了解mysqlmysqli擴展與PDO的區別,PDO與ADODB又有什麼區別。在本章中將講述以下內容,通過學習,上面的問題都會迎刃而解。

抽象層與抽象類


Ø 使用資料庫抽象層的原因;
Ø 資料庫抽象層的發展;
Ø 一些流行新抽象層的介紹;
Ø PDO資料庫抽象層開發技術;
Ø ADODB資料庫抽象層開發技術。

定義


首先,代碼規劃必須規範,即整個系統使用同一個數據對象實例,並且使用同一個較好的資料庫抽象層。如果有一天用戶要求將Oracle切換到MySQL,則只需要改變系統的配置文件即可。
在當今工業領域中,每個資料庫開發商如微軟、Oracle、MySQL,都有自己的一套SQL標準,它們聲稱是按照ANSI SQL92標準而增加自己的特性,以達到壟斷或佔領市場的目的。
優秀的資料庫抽象層,會根據我們使用的資料庫自動調整一些SQL性能。當沒有使用資料庫本身特定的特性時,就不必更改太多的資料庫連接和資料庫SQL查詢。
使用資料庫抽象層的其他好處是:其性質、概念簡化了複雜的任務。因此,我們不必學習某個資料庫系統的全新特性,而只用一個標準的抽象層的代碼特性即可。
雖然這是一種理想化,但隨著技術的發展,相信資料庫抽象層會為我們做更多的事。
使用PHP進行不同的資料庫系統開發,這些系統很不相同,而許多資料庫抽象層在PHP的層次有所不同,但彼此使用方法相當,它的發展無疑會提高開發效率。
請看圖17-1,觀察有數據抽象層和沒有數據抽象層的區別。
資料庫抽象層的主要性能指標是速度,由於資料庫抽象層是額外的代碼層,因為面向不同的架構與體系,因此有的效率較高,有的則相對比較慢些。
如Metabase是PHP中較慢的一個數據抽象層,它使用C語言編寫,因為它的設計與可移植性最高,而PDO和ADODB是當今世界最快的資料庫抽象類。
圖17-1
如果您非常關注系統的效率和性能,則可以按自己的基準,設置模擬環境,編寫代碼,測試每個資料庫抽象層(類)的性能。
用資料庫抽象層,意味著當從一個資料庫系統向另一個資料庫系統遷移時,幾乎不用更改太多的程序代碼,如將MS SQL Server遷移到MySQL。

常用的


有4種主流資料庫抽象層:Metabase、PEAR:DB、PDO及ADODB。
從應用來看,ADODB和PEAR:DB最受歡迎(因為PEAR是被捆綁在PHP目錄中的,但PEAR:DB的效率問題一直引人詬病)。
PHP 5開始出現的PDO及ADODB(其中包括PDO、MySQLi的底層實現)已經逐漸普及。
也有一些更新的抽象類值得一用,PEAR:MDB(版本名稱為PEAR:MDB2)已經將Metabase和PEAR:DB合併,並且效率較之從前有很大的提高。

ADODB-實例


require ‘adodb/adodb.inc.php’;
// Connect to the database
$conn = &ADONewConnection(‘mysql’);
$conn->connect(‘localhost’,'phpgems’,'phpgems1′,’phpgems’);
// Send a SELECT query to the database
$rs = $conn->execute(‘SELECT flavor, price, calories FROM _
ice_cream’);
// Check if any rows were returned
if ($rs->RecordCount() > 0) {
print “
”;
print “
”;
// Retrieve each row
while (! $rs->EOF) {
print “
n”;
$rs->MoveNext();
}
print “
Ice Cream FlavorPrice per ServingCalories per Serving
{$rs->fields[0]}{$rs->fields[1]}{$rs->f ields[2]}
”;
} else {
print “No results”;
}

PDO-實例


$dbms='mysql';
$host='localhost';
$dbName='test';
$user='root';
$pass='leyangjun';
$dsn="$dbms:host=$host;dbname=$dbName";
try{
$dbh=new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
echo"成功連接!
";
$result=$dbh->query('select * from timing_delivery');
//var_dump($result);
foreach($result as $row){
echo"
";
print_r($row);
echo "";
}
$dbh=null;
}catch(PDOException $e){
die("Error!連接失敗:".$e->getMessage()."
");
}