資料庫抽象層

目前,在PHP的網站及眾多書籍中,很少講到資料庫抽象層,有的PHP開發者雖然已做了幾年開發工作,但似乎也沒有意識到它的存在。很多人並不理解數據抽象的重要性,也不了解mysql或mysqli擴展與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 “<table>”;

print “<tr><TH>Ice Cream Flavor</TH><TH>Price per Serving</TH><TH>Calories per Serving</TH></TR>”;

// Retrieve each row

while (! $rs->EOF) {

print “<tr><TD>{$rs->fields[0]}</TD><TD>{$rs->fields[1]}</TD><TD>{$rs->f ields[2]}</TD></TR>n”;

$rs->MoveNext();

}

print “</table>”;

} 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"成功連線!<br/>";
$result=$dbh->query('select * from timing_delivery');
//var_dump($result);
foreach($result as $row){
echo"<pre>";
print_r($row);
echo "</pre>";
}
$dbh=null;
}catch(PDOException $e){
die("Error!連線失敗:".$e->getMessage()."<br/>");
}

相關詞條

熱門詞條

聯絡我們