目錄 1. PHP資料庫驅動簡介2. PHP串連資料庫的不同方式 1. PHP資料庫驅動簡介 驅動是一段設計用來於一種特定類型的資料庫伺服器進行互動的軟體代碼。驅動可能會調用一些庫。類似於Java中的資料庫驅動的概念 複製代碼1. JDBC-ODPC橋:它將JDBC API映射到ODPC API。再讓JDBC-ODPC調用資料庫本地驅動代碼(也就是資料庫廠商提供的資料庫操作二進位程式碼程式庫,例如Oracle中的oci.dll)2. 本地API驅動直接將JDBC API映射成資料庫特定的用戶端API,即通過用戶端載入資料庫廠商提供的本地程式碼程式庫(C/C++等) 3. 網路通訊協定驅動(主流)這種類型的驅動給用戶端提供了一個網路API,用戶端上的JDBC驅動程式使用通訊端(Socket)來調用伺服器上的中介軟體程式,後者在將其請求轉化為所需的具體API調用。4. 本地協議驅動(主流)這種類型的驅動使用Socket,直接在用戶端和資料庫間通訊。它是一種直接與資料庫執行個體互動的JDBC這種驅動是智能的,它知道資料庫使用的底層協議,也是目前最主流使用的JDBC驅動,我們本章的重點就是它複製代碼而對於PHP來說,同樣主流使用的也是網路通訊協定驅動、本地協議驅動,即MySQL用戶端庫、MySQL Native驅動庫。 這些庫實現了用於和MySQL資料庫伺服器進行互動的底層協議。資料庫驅動位於PHP和資料庫進行通訊的最底層,不同的資料庫廠商都會在基於某個架構的前提下實現自己的驅動,用以提供準系統、以及特定資料庫的進階功能。 在驅動層之上是"連接器"、或者是適配器抽象層,用於PHP代碼和資料庫進行串連,程式員可以使用PDO(PHP Database Object)、或者直接使用擴充介面(mysql、mysqli)這些暴露出來的API與底層資料庫進行通訊。 資料庫廠商提供的底層資料庫驅動 mysql: http://www.mysql.com/products/connector/oracle: http://www.oracle.com/technetwork/indexes/downloads/index.html#databasesqlserver: http://msdn.microsoft.com/zh-cn/library/cc296170(SQL.90).aspx ...檔案型資料庫 檔案型是一種基於檔案的資料庫引擎,而且使用檔案I/O(輸入/輸出)函數來儲存和讀取來自磁碟上檔案的資料庫。它普遍也比關係型資料庫(例如Mysql)小很多很多(例如典型的檔案型資料庫SQLite命令列版本的大小小於200KB),同時,檔案型資料庫而且支援你所熟悉的大部分SQL命令,同時具有易於攜帶的特點接下來,我們以上面這張大圖作為開始,逐一學習PHP串連資料庫的不同方式、以及它們在不同業務情境下的優缺點 2. PHP串連資料庫的不同方式 0x1: 使用擴充API介面與資料庫通訊 PHP代碼是由一個核心,一些可選向外延展群組成了核心功能。PHP 的MySQL相關擴充,比如mysqli,mysql都是基於PHP擴充架構實現的。擴 展一個典型的作用就是暴露一個API給PHP程式員,允許擴充自己的功能可以被程式員使用。當然,也有一部分基於PHP擴充架構 開發的擴充不會給PHP程式員暴露API介面。比如說PDO MySQL驅動擴充,就沒有向PHP程式員暴露API介面,但是向它上層的PDO層提供了一個介面。 關於PHP擴充的編寫請參閱另一篇博文http://www.cnblogs.com/LittleHann/p/3562259.html在實際編程中,使用頻度最多的還是以擴充API的方式去串連資料庫 extension=php_mysql.dll 這 是設計開發允許PHP應用與MySQL資料庫互動的早期擴充。mysql擴充提供了一個面向過程的介面,並且是針對MySQL4.1.3或更早版本設計 的。因此,這個擴充雖然可以與MySQL4.1.3或更新的資料庫服務端 進行互動,但並不支援後期MySQL服務端提供的一些特性mysql擴充的原始碼在PHP擴充目錄ext/mysql下 複製代碼\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t\n"; foreach ($line as $col_value) { echo "\t\t$col_value\n"; } echo "\t\n"; } echo "\n"; // 釋放結果集 mysql_free_result($result); // 關閉串連 mysql_close($link);?>複製代碼extension=php_mysqli.dll mysqli擴充,我們有時稱之為MySQL增強擴充,可以用於使用MySQL4.1.3或更新版本中新的進階特性。mysqli擴充在PHP 5及以後版本中包含。mysqli擴充有一系列的優勢,相對於mysql擴充的提升主要有: 複製代碼1. 物件導向介面2. prepared語句支援(即參數編譯預先處理,可以有效防禦SQL注入的發生)3. 多語句執行支援4. 事務支援5. 增強調試能力6. 嵌入式服務支援7. 在提供了物件導向介面的同時也提供了一個面向過程的介面。複製代碼mysqli擴充是使用PHP擴充架構構建的,它的原始碼在PHP源碼目錄下的ext/mysqli中 複製代碼prepare($sql); $name = $_GET['name']; $pass = $_GET['pass']; //add parameters to sql query $cmd->bind_param("ss", $name, $pass); $cmd->execute(); $cmd->bind_result($result); $cmd->fetch(); if($result) { var_dump($result); }?>複製代碼mysqli除了可以使用參數編譯預先處理來進行資料庫通訊,同時也相容使用面向過程的編碼方式 複製代碼 複製代碼PHP還支援很多其他的資料庫連接擴充,使用方法都類似,只要遵循函數調用規範即可,更多詳情請參閱 http://www.php.net/manual/zh/refs.database.php 0x2: 使用PDO抽象層與資料庫通訊 PDO(PHP 資料對象 PHP Database Object),是PHP應用中的一個資料庫抽象層規範。PDO提供了一個統一的API介面可以使得你的PHP應用不去關心具體要串連的資料庫伺服器系統 類型。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換資料庫伺服器,比如從Firebird到MySQL,僅僅需要修改很少的PHP 代碼。其他資料庫抽象層的例子包括Java應用中的JDBC以及Perl中的DBI。 注意: 利用 PDO 擴充自身並不能實現任何資料庫功能;必須使用一個具體資料庫的PDO驅動來訪問資料庫服務(它只是一個介面規範)但是反過來說,一個介面提供的相容性越強,它的定製性、特異性就相應越弱(這很容易理解),PDO介面API的主要缺點是會限制讓你不能使用MySQL服務端提供所有的資料庫進階特性。比如,PDO不允許使用MySQL支援的多語句執行。 在PHP5中,PDO目前已經支援大量資料庫,並且在PHP6中將作為預設資料庫串連方式: 1. sqlite2. mysql3. pgsql4. mssql ...PDO是基於PHP擴充架構實現的,它的源碼在PHP源碼目錄的ext/pdo下 再次強調,PDO只是一個介面規範,它自身並不實現任何的資料庫功能,程式員必須使用一個具體資料庫的"PDO驅動"來訪問特定的資料庫 extension=php_pdo_mysql.dll 複製代碼 'SET NAMES utf8',); $dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname; try { $dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt); //Display exception $dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } catch (PDOExceptsddttrtion $e) { //return PDOException print "Error!: " . $e->getMessage() . "
"; die(); } $dbstm = $dbhdl->query('SELECT * from p8_ad_user LIMIT 0,1'); $rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//$rows = $dbhdl->Fetch(); print_r($rows);?>複製代碼extension=php_pdo_pgsql.dll 複製代碼"; } catch (Exception $e) { echo "Unable to connect: " . $e->getMessage() ."
"; } $dbh->beginTransaction(); $query = "SELECT * from p8_ad_user LIMIT 0,1"; $dbh->query($query); $query = "FETCH ALL IN \"$cursor\""; echo "begin data
"; foreach ($dbh->query($query) as $row) { echo "$row[0] $row[1] $row[2]
"; } echo "end data";?>複製代碼這裡只以Mysql、PostGreSQL為例,事實上,PDO這種抽象層方式可以訪問目前主流的大多數的資料庫,並且PDO將成為PHP6的預設資料庫串連方式,更多詳情請參閱 http://www.php.net/manual/zh/book.pdo.php 0x3: 使用ODBC抽象層與資料庫通訊 ODBC是一種API(Application Programming Interface,API),使我們有能力串連到某個資料來源(比如一個MS Access 資料庫) 試圖通過程式設計語言和資料庫查詢訪問(SQL標準化)來標準化串連方法,比如功能和配置。ODBC的作用是充當介面或連接器,它具有雙重設計目標: 1. 首先,對於ODBC 系統,它充當的是程式設計語言系統2. 其次,對於資料存放區系統,它充當的是 ODBC 系統。所 以,ODBC 需要一個"對ODBC而言是程式設計語言"的驅動程式(例如PHP-ODBC庫)和一個"對資料存放區系統而言是ODBC"的驅動程式(比如 MySQL-ODBC庫)。除了ODBC系統本身之外,ODBC還可以處理資料來源的配置,允許資料來源和程式設計語言之間存在模糊性。和之前學習的擴充API介面、PDO略有不同的是,使用ODBC串連資料庫要稍微麻煩一點(至少我個人這麼覺得),這個"麻煩"體現在我們需要對目標資料庫伺服器的作業系統進行一些配置,即建立ODBC資料來源,然後才可以進行ODBC串連建立到達 MS Access 資料的 ODBC 串連的方法: 複製代碼1. 在控制台中開啟管理工具2. 雙擊其中的資料來源 (ODBC)表徵圖3. 選擇系統 DSN 選項卡4. 點擊系統 DSN 選項卡中的"添加"按鈕5. 選擇 Microsoft Access Driver。點擊完成6. 在下一個介面,點擊“選擇”來定位元據庫7. 為這個資料庫取一個資料來源名 (DSN)8. 點擊確定複製代碼code: 複製代碼 "; echo "Companyname"; echo "Contactname"; while (odbc_fetch_row($rs)) { $username = odbc_result($rs, "username"); $password = odbc_result($rs, "password"); echo "$username"; echo "$password"; } odbc_close($conn); echo "";?>複製代碼 0x4: 使用DBX與資料庫通訊 PHP本身內建了DBX函數,DBX模組是一個資料庫抽象層(DBX中的"X"就表示其所能支援的X種資料庫)。DBX函數允許你訪問所有DBX支援的資料庫。DBX支援下列資料庫: 1. Mysql2. ODBC3. PgSQL4. Mssql(Microsoft SQL Server)5. Fbsqldownload: http://pecl.php.net/package/dbxhttp://rpmfind.net/linux/rpm2html/search.php?query=php-dbxcode: 複製代碼 A PHP-DBX URL Organizer ERROR ADDING URL: " . dbx_error($dbconn); } else { print("
$action : $url succeeded!
"); }} /*** MAIN ***/$dbconn = dbx_connect($MODULE, $server, $database, $user, $password) or die("CANNOT CONNECT TO DATABASE");?>
PHP DBX URL Organizer
data) == 0) {?>
Sorry, there are no URLs in the database. You should add some.
| URL |
Description |
|
data); $i++) {?>
| data[$i]['url']?>>data[$i]['url']?> |
data[$i]['description']?> |
data[$i]['url'])?>>delete |
複製代碼 0x5: 使用DBA(Database (dbm-style) Abstraction Layer)與資料庫通訊 PHP的DBA抽象層是用來支援Berkeley DB這種檔案型資料庫的。 These functions build the foundation for accessing Berkeley DB style databases.在柏克萊的BSD系列作業系統中,有個簡單的資料庫結構,它以數個檔案組成超小型的資料庫系統,架構成抽象層(abstraction layer)的DBA資料庫。目前PHP支援的DBA資料庫包括 複製代碼1. DBM: 柏克萊發展的最早期DBA資料庫http://en.wikipedia.org/wiki/Dbm2. NDBM: 較新且較有彈性的DBAhttp://en.wikipedia.org/wiki/NDBM3. GDBM: GNU 發展的DBAftp://ftp.gnu.org/pub/gnu/gdbm/4. DB2: 由Sleepycat軟體開發的DB2(非IBM的DB2)http://www.openldap.org/lists/openldap-software/199905/msg00009.html5. CDB: 這是qmail作者開發快速可靠的DBAhttp://pobox.com/~djb/cdb.html複製代碼安裝好DBA後,使用如下代碼進行串連 複製代碼複製代碼 3. 後記 以上就是PHP串連資料庫的不同方式的學習,通過本文的學習,我們瞭解到一點 目前PHP開發中主流使用的串連資料庫的技術是1. Mysql擴充API2. Mysqli擴充API3. PDO抽象層下一步希望做的事 1. 研究一下PHP和mysql進行互動的協議驅動的底層原理2. 嘗試編程簡單的通訊協定驅動
http://www.bkjia.com/PHPjc/762932.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/762932.htmlTechArticle目錄 1. PHP資料庫驅動簡介 2. PHP串連資料庫的不同方式 1. PHP資料庫驅動簡介 驅動是一段設計用來於一種特定類型的資料庫伺服器進行互動的...