資料庫抽象層

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

基本介紹

  • 中文名:資料庫抽象層
  • 語言:PHP
  • 原因:使用資料庫抽象層的原因
  • 代表:MS SQL Server遷移到MySQL
抽象層與抽象類,定義,常用的,ADODB-實例,PDO-實例,

抽象層與抽象類

Ø 使用資料庫抽象層的原因;
Ø 資料庫抽象層的發展;
Ø 一些流行新抽象層的介紹;
Ø 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/>");
}

相關詞條

熱門詞條

聯絡我們