複製鏈接
請複製以下鏈接發送給好友

數據庫抽象層

鎖定
在PHP的網站及眾多書籍中,很少講到數據庫抽象層,有的PHP開發者雖然已做了幾年開發工作,但似乎也沒有意識到它的存在。很多人並不理解數據抽象的重要性,也不瞭解mysql或mysqli擴展與PDO的區別,PDO與ADODB又有什麼區別。在本章中將講述以下內容,通過學習,上面的問題都會迎刃而解。
中文名
數據庫抽象層
語    種
PHP
原    因
使用數據庫抽象層的原因
代    表
MS SQL Server遷移到MySQL
類    型
電子信息工程術語

數據庫抽象層抽象層與抽象類

Ø 使用數據庫抽象層的原因;
Ø 數據庫抽象層的發展;
Ø 一些流行新抽象層的介紹;
Ø 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合併,並且效率較之從前有很大的提高。

數據庫抽象層實例

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 Flavor
Price per Serving
Calories 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()."
");
}