|
現(xiàn)在你已經(jīng)可以熟練地使用MySQL客戶端軟件來操作數(shù)據(jù)庫里的數(shù)據(jù),我們也可以開始學(xué)習(xí)如何使用PHP來顯示和修改數(shù)據(jù)庫里的數(shù)據(jù)了。PHP有標(biāo)準(zhǔn)的函數(shù)用來操作數(shù)據(jù)庫。 我們首先學(xué)習(xí)PHP內(nèi)建的數(shù)據(jù)庫函數(shù),然后會學(xué)習(xí)PHP擴(kuò)展和應(yīng)用程序庫(PEAR,PHP Extension and Application Repository )中的數(shù)據(jù)庫函數(shù),我們可以使用這些函數(shù)操作所有支持的數(shù)據(jù)庫。這種靈活性源自于抽象。對于編程接口而言,抽象簡化了復(fù)雜的交互過程。它將交互過程中無關(guān)緊要的部分屏蔽起來,讓你關(guān)注于重要的部分。PEAR的DB類就是這樣一種數(shù)據(jù)庫接口的抽象。你登錄一個數(shù)據(jù)庫所需要提供的信息被減少到最少。這種標(biāo)準(zhǔn)的格式可以通過同一個函數(shù)來訪問MySQL以及其他的數(shù)據(jù)庫。同樣,一些MySQL特定的函數(shù)被更一般的、可以用在很多數(shù)據(jù)庫上的函數(shù)所替代。比如,MySQL特定的連接函數(shù)是: mysql_connect($db_host, $db_username, $db_password); 而PEAR的DB提供的連接函數(shù)是: $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database" ); 兩個命令都提供了同樣的基本信息,但是PEAR的函數(shù)中還指定了要連接的數(shù)據(jù)庫的類型。你可以連接到MySQL或者其他支持的數(shù)據(jù)庫。我們會詳細(xì)討論這兩種 連接方式。 本章中,我們會學(xué)習(xí)如何從PHP連接到MySQL的服務(wù)器,如何使用PHP訪問數(shù)據(jù) 庫中存儲的數(shù)據(jù),以及如何正確的向用戶顯示信息。 無論是通過MySQL命令行工具,還是通過PHP,執(zhí)行一個查詢的基本步驟都是一樣的: ? 連接到數(shù)據(jù)庫 ? 選擇要使用的數(shù)據(jù)庫 ? 創(chuàng)建SELECT語句 ? 執(zhí)行查詢 ? 顯示結(jié)果 我們將逐一介紹如何用PHP和PEAR的函數(shù)完成上面的每一步。 當(dāng)連接到MySQL數(shù)據(jù)庫的時候,你會使用到兩個新的資源。第一個是連接的標(biāo)識符,它記錄了一個活動連接用來連接到數(shù)據(jù)庫所必需的所有信息。另外一個資源是結(jié)果資源,它包含了用來從一個有效的數(shù)據(jù)庫查詢結(jié)果中取出結(jié)果所需要的所有信息。本章中我們會創(chuàng)建并使用這兩種資源。 本節(jié)我們會介紹如何使用PHP連接MySQL數(shù)據(jù)庫。這非常簡單,我們會用一些例子說明。但是之前我們應(yīng)該稍微了解一下幕后發(fā)生的事情。當(dāng)你試圖連接一個MySQL數(shù)據(jù)庫的時候,MySQL服務(wù)器會根據(jù)你的用戶名和密碼進(jìn)行身份認(rèn)證。PHP為你建立數(shù)據(jù)庫的連接,你可以立即開始查詢并得到結(jié)果。 我們需要同樣的信息來連接數(shù)據(jù)庫: ? 數(shù)據(jù)庫服務(wù)器的IP地址 ? 數(shù)據(jù)庫的名字 ? 用戶名 ? 密碼 在開始之前,首先使用MySQL的命令行客戶端確認(rèn)你登錄到數(shù)據(jù)庫。 圖9-1顯示了數(shù)據(jù)庫交互過程的各個步驟和兩種類型資源之間的關(guān)系。創(chuàng)建SELECT語句發(fā)生在第三個函數(shù)調(diào)用之前,但是在圖中沒有顯示出來。它是通過普通的PHP代碼,而不是MySQL特定的PHP函數(shù)完成的。使用數(shù)據(jù)庫時函數(shù)和資源之間的交互我們先創(chuàng)建一個文件,用來保存登錄MySQL所用到的信息。我們建議你把這些信息放在單獨(dú)的文件里然后通過include來使用這個文件。這樣一來如果你修改了數(shù)據(jù)庫的密碼。無論有多少個PHP文件訪問數(shù)據(jù)庫,你只需要修改這一個文件。 不用擔(dān)心有人會直接看到這個文件從而得到你的數(shù)據(jù)庫的登錄信息。如何被直接請求,這個文件會被當(dāng)作PHP文件處理,返回結(jié)果是一個空白頁。 假設(shè)這個文件的名字叫做db_login.php,并且它跟其他所用PHP文件放在同一個目錄下。這個文件的內(nèi)容如例9-1所示。 <?php $db_host='hostname of database server'; $db_database='database name'; $db_username='username'; $db_password='password'; ?> 在例9-2中,我們創(chuàng)建的文件使用跟Web服務(wù)器放在同一臺機(jī)器上的數(shù)據(jù)庫,并指定的數(shù)據(jù)庫的名字,用戶名和密碼。 例9-2:db_login.php文件示例 <?php $db_host='localhost'; $db_database='test'; $db_username='test'; $db_password='yourpass'; ?> 圖9-2顯示了如何在其他PHP文件中使用這個文件。我們會繼續(xù)使用在第七章中創(chuàng)建的數(shù)據(jù)庫。 圖9-2:在多文件中重復(fù)使用登錄信息 例9-3是精簡后的,用mysqldump命令得到的重建這個數(shù)據(jù)庫的SQL命令。 例9-3:重建測試數(shù)據(jù)庫的SQL語句 DROP TABLE IF EXISTS books; CREATE TABLE books ( title_id int(11) NOT NULL auto_increment, title varchar(150) default NULL, pages int(11) default NULL, PRIMARY KEY (title_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Dumping data for table books -- INSERT INTO books VALUES (1,'Linux in a Nutshell',476),(2,'Classic Shell Scripting',256); -- -- Table structure for table purchases -- DROP TABLE IF EXISTS purchases; CREATE TABLE purchases ( id int(11) NOT NULL auto_increment, user varchar(10) default NULL, title varchar(150) default NULL, day date default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Dumping data for table purchases -- LOCK TABLES purchases WRITE; INSERT INTO purchases VALUES (1,'Mdavis','Regular Expression Pocket Reference','2005-02-15'),(2,'Mdavis','JavaScript & DHTML Cookbook','2005-02-10'); 如果你在第8章中沒有創(chuàng)建這些表,可以將例9-3中的代碼保存成文件backup.sql,然后在命令行執(zhí)行命令,命令格式如下: mysql -u username -ppassword -D database_name < backup_file_name.sql 如果使用例子中的值,那么這個命令就是: mysql -u test -pyourpass -D test < backup.sql 數(shù)據(jù)庫的名字叫test,它包含三個表,分別是books、authors和purchases。 每個表都有一些示例記錄。這些就足以讓我們開始使用PHP來進(jìn)行查詢了。 我們需要做的頭一件事情是連接數(shù)據(jù)庫,并且檢查連接是否確實建立起來。如例 9-4所示,通過include包含連接信息的文件,我們可以在調(diào)用mysql_connect 函數(shù)的時候使用這些變量而不是將這些值寫死在代碼中。我們使用一個叫做 db_test.php的文件,往其中增加這些代碼段。 例9-4:在db_test.php中包含連接參數(shù)和調(diào)用mysql_connect // Include our login information include('db_login.php'); // Connect $connection = mysql_connect($db_host, $db_username, $db_password); if (!$connection){ die ("Could not connect to the database: <br />". mysql_error( )); } 函數(shù)mysql_connect的參數(shù)是數(shù)據(jù)庫服務(wù)器主機(jī)、用戶名和密碼。如果連接成功,就會返回新建立的連接,如果不能建立連接就會返回FALSE。檢查這個函數(shù)的返回值來確保連接的確建立起來了。如果遇到問題,比如不正確的密碼,可以使用mysql_error打印一條友好的警告信息以及導(dǎo)致錯誤的原因。 不僅僅是打印一條錯誤信息,die()還會停止這個程序的執(zhí)行。對于大部分?jǐn)?shù)據(jù)庫驅(qū)動網(wǎng)頁來說,不能訪問數(shù)據(jù)庫就意味著網(wǎng)頁毫無用處。通過使用die來終止程序的執(zhí)行,可以避免用戶看到大量的錯誤信息。 請注意我們還沒有指定數(shù)據(jù)庫的名字。 你可能遇到的一個錯誤是: Fatal error: Call to undefined function mysql_connect( ) in C:Program FilesApache Software FoundationApache2.2htdocsdb_test.php on line 4這個錯誤發(fā)生的原因是下載安裝的PHP5.x默認(rèn)沒有包括對MySQL的支持。解決這個問題需要將php_mysql.dll文件從PHP壓縮包例的ext/目錄復(fù)制到C:/php, 并修改C:WINDOWSphp.ini文件,確保下面兩行沒有被注釋掉(注釋的方法在行首使用分號)。 extension_dir = "c:/PHP/ext/" extension=php_mysql.dll 這樣PHP擴(kuò)展的目錄就被設(shè)為C:PHP,MySQL的擴(kuò)展也會被使用。在編輯php.ini文件的時候,你可以使用編輯器的搜索功能來檢查這兩行是否已經(jīng)存在,只是需要去掉注釋,并且需要重新輸入。 重新啟動Apache,這樣MySQL的支持就會被打開了。 建立連接之后,下一步就是使用mysql_select_db來選擇我們要用的數(shù)據(jù)庫。它的參數(shù)有兩個:數(shù)據(jù)庫名和可選的數(shù)據(jù)庫連接。如果不指定數(shù)據(jù)庫連接,默認(rèn)使 用上一條mysql_connect所建立的連接。 // Select the database $db_select=mysql_select_db($db_database); if (!$db_select) { die ("Could not select the database: <br />". mysql_error( )); } 同樣的,每次訪問數(shù)據(jù)庫的時候最好能檢查可能的錯誤并且進(jìn)行顯示。 雖然可以在同一個腳本里多次調(diào)用mysql_select_db,但這不是一個好習(xí)慣。 現(xiàn)在我們做好了一切準(zhǔn)備工作,可以開始執(zhí)行SQL查詢了。 構(gòu)建SQL查詢非常容易就是將一個字符串賦值給變量。這個字符串就是我們的 SQL查詢,當(dāng)然我們要給出有效的SQL查詢,否則執(zhí)行這個查詢的時候MySQL會返回錯誤。我們使用$query作為變量名,這個名字對應(yīng)其目的,你也可以選擇任何你喜歡的變量名。這個例子中的SQL查詢是”SELECT * FROM books”。 跟使用mysql命令行客戶端不同,這里的查詢不需要以分號結(jié)尾。 你可以使用字符串連接操作符(.)來構(gòu)建查詢: // Assign the query $select = ' SELECT '; $column = ' * '; $from = ' FROM '; $tables = ' books '; $where = ' NATURAL JOIN authors'; $query = $select.$column.$from.$tables.$where; 這個版本的代碼比下面的代碼要靈活多了: // Assign the query $query = "SELECT * FROM books NATURAL JOIN authors"; 查詢字符串也可以在WHERE子句中使用變量來限定返回什么樣的行,這些變量可能是用戶信息,也可能是來自其他的查詢。 現(xiàn)在我們已經(jīng)將查詢賦值給了一個變量,下一步就是執(zhí)行它。 使用mysql_query函數(shù)來告訴數(shù)據(jù)庫執(zhí)行查詢。它有兩個參數(shù):查詢和可選的數(shù)據(jù)庫連接,返回值是查詢結(jié)果。我們將查詢結(jié)果保存在一個變量里,也許你已經(jīng)猜到我們要用變量名就是$result。這里同樣有必要檢查mysql_query的返回值不是FALSE來確保查詢字符串和數(shù)據(jù)庫連接都沒有問題。 // Execute the query $result = mysql_query( $query ); if (!$result){ die ("Could not query the database: <br />". mysql_error( )); } 當(dāng)數(shù)據(jù)庫查詢的時候,所有的結(jié)果構(gòu)成一個結(jié)果集。這些結(jié)果跟使用mysql命令行客戶端執(zhí)行同樣查詢所得到的行一致。要顯示這些結(jié)果,你需要依次處理這些行。 使用mysql_fetch_row從結(jié)果集中取出一行,它的用法如下: array mysql_fetch_row ( resource $result); 它的參數(shù)是SQL查詢返回的結(jié)果,我們將結(jié)果保存在$result中。每次調(diào)用它返回一行數(shù)據(jù),直到?jīng)]有數(shù)據(jù)為止,這時候它返回FALSE。這樣,我們可以使用一個循環(huán),在循環(huán)內(nèi)調(diào)用mysql_fetch_row并使用一些代碼來顯示每一行。 // Fetch and display the results while ($result_row = mysql_fetch_row(($result))){ echo 'Title: '.$result_row[1] . '<br />'; echo 'Author: '.$result_row[4] . '<br /> '; echo 'Pages: '.$result_row[2] . '<br /><br />'; } 結(jié)果行的所有列都保存在一個數(shù)組里,可以方便地進(jìn)行訪問。變量$result_row[2]訪問結(jié)果行的第二個屬性(數(shù)組的順序是查詢是定義的列的順序,如果使用SELECE * ,那么數(shù)組順序就是表的列的順序)。 去結(jié)果的方式不止一種。使用mysql_fetch_arrry可以一次性將所有結(jié)果放在一個數(shù)組里。它的參數(shù)是查詢結(jié)果和一個可選的結(jié)果綁定方式。如果綁定方式指定為MYSQL_ASSOC,數(shù)組中的結(jié)果則使用查詢中列的名字進(jìn)行訪問。如果指定了MYSQL_NUM,那么就使用從0開始的數(shù)字來訪問結(jié)果。默認(rèn)使用的方式是MYSQL_BOTH,這樣返回的數(shù)組支持兩種類型的訪問。Mysql_fetch_assoc是使用MYSQL_ASSOC取結(jié)果的另外一種方式。 用mysql_fetch_array加上MYSQL_ASSOC的方式重寫上面的代碼,如下所示: // Fetch and display the results while ($result_row = mysql_fetch_array($result, MYSQL_ASSOC)){ echo 'Title: '.$result_row['title'] . '<br />'; echo 'Author: '.$result_row['author'] . '<br /> '; echo 'Pages: '.$result_row['pages'] . '<br /><br />'; } 絕大部分情況下,我們在使用完一個數(shù)據(jù)庫之后要關(guān)閉到它的連接。使用mysql_close來關(guān)閉一個數(shù)據(jù)庫,它會告訴PHP和MySQL這個數(shù)據(jù)庫連接已經(jīng)不再使用,所使用的所有資源和內(nèi)存都可以釋放。 mysql_close($connection) PEAR是一個框架和可重用PHP組建的發(fā)布系統(tǒng),它為PHP開發(fā)提供了一套增強(qiáng)的功能,PEAR包括很多種模塊,用來處理從會話管理到購物車功能的幾乎所有事情。表9-1列出了現(xiàn)有的模塊種類。 表9-1:PEAR模塊種類 Authentication HTML Processing Benchmarking HTTP Science Caching Images Semantic Web Configuration Internationalization Streams Console Logging Structures Database Mail System Date/Time Math Test Encryption Networking Tools and utilities Event Numbers Validate File formats Payment Web services File system PEAR XML GTK components PHP 我們的列表還不夠完整,可以訪問來獲得供下載的所有模塊。 PEAR使用包管理器來管理安裝PEAR模塊。是否需要安裝包管理取決于你所使用的PHP版本。如果你使用的版本是PHP4.4.0或者更新的版本,那么就已經(jīng)安裝了包管理器。如果你使用的是PHP5.0,則PEAR是一個單獨(dú)的包。我們要用到的DB包是可選的,但是它會被包管理器默認(rèn)安裝。所以,如果你有包管理器,那么就全搞定了。 在UNIX系統(tǒng)下,可以通過在shell(命令行)下執(zhí)行下面的命令來安裝包管理器:lynx -source | php 這個命令使用go-pear.org的輸出(實際就是PHP源代碼)來安裝PEAR, go-pear.org的輸出被傳給php命令執(zhí)行。 安裝完P(guān)HP5后,會有一個PEAR安裝腳本C:phpgo-pear.bat。如果你在第二章沒有安裝所以文件,那么現(xiàn)在把所有的PHP文件都解壓到C:php下,然后執(zhí)行這個批處理文件。 如果你是通過MSI安裝程序安裝PHP,需要執(zhí)行下面的命令而不是使用go-pear.bat文件:php go-pear.phar如果PEAR目錄不存在,那就需要重新執(zhí)行PHP的MSI安裝程序,選擇Change選項,然后將“Extensions and Extras”設(shè)置成“Will be installed on local drive”。完畢后再執(zhí)行g(shù)o-pear.phar。 圖9-5顯示執(zhí)行PEAR安裝程序后的初始屏幕。 圖9-5:go-pear.bat安裝腳本 安裝程序會要求輸入幾個路徑,你可以使用默認(rèn)值。那樣安裝的最上級目錄就是c:php. php.exe必須位于系統(tǒng)路徑中。在命令行輸入php.exe來確認(rèn)。如果沒有找到這個命令,那需要將它的路徑加到PATH變量中。要修改系統(tǒng)的PATH變量,選擇“開始—控制面板—系統(tǒng)—環(huán)境變量”,在PATH變量的后面增加一項C:php”。 PEAR安裝程序會創(chuàng)建文件C:phpPEAR_ENV.reg,雙擊該文件在注冊表中設(shè)置PEAR的路徑。這個文件的內(nèi)容視安裝的PEAR版本而定。當(dāng)彈出對話框要求確認(rèn)的時候,點(diǎn)擊OK將信息加入注冊表。 在執(zhí)行完這個批處理文件后,你可能需要編輯php.ini文件,將PEAR的目錄入到include_path中。Php.ini的447行看起來如下: include_path = ".;c:phpincludes;c:phpPEAR" Apache必須重啟才能使用DB包。 大部分人的ISP都安裝了PEAR DB。如果你的ISP沒有提供,可以要求他們安裝。你可以通過執(zhí)行例9-8中的代碼來判斷PEAR DB是否已經(jīng)安裝,如果沒有,那么在執(zhí)行這個腳本的時候“require_once(‘DB.php’)”這一行就會報錯。 完成上面的步驟之后,你可以通過在命令行輸入“pear”來運(yùn)行PEAR的包管理器。增加新的模塊非常容易,只需要執(zhí)行“pear packagename”就可以了。你不需要安裝DB模塊,因為在安裝包管理器的時候它已經(jīng)默認(rèn)安裝了。 不過如果你運(yùn)行的是Windows XP Home ,需要執(zhí)行下面的步驟來安裝PEAR DB: C:>cd c:php C:>pear install DB C:>pear list 找出安裝PEAR包的版本,執(zhí)行pear list。這個命令返回一個列表,如圖9-6 所示: 圖9-6:安裝的PEAR包和版本列表 一旦安裝完P(guān)EAR,我們就可以開始使用它了。 使用PEAR DB包的時候,執(zhí)行的步驟和使用PHP函數(shù)是類似。不過,函數(shù)的用法有細(xì)微的不同。我們會逐行解釋兩者的差別,如例9-7所示。 例9-7:用PEAR DB 顯示books表 1 <?php 2 3 include('db_login.php'); 4 require_once('DB.php'); 5 6 $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database" ); 7 8 if (DB::isError($connection)){ 9 die("Could not connect to the database: <br />".DB::errorMessage($connection)); 10 } 11 12 $query = "SELECT * FROM books NATURAL JOIN authors"; 13 $result = $connection->query($query); 14 15 if (DB::isError($result)){ 16 die("Could not query the database:<br />$query ".DB::errorMessage($result)); 17 } 18 19 echo('<table border="1">'); 20 echo '<tr><th>Title</th><th>Author</th><th>Pages</th></tr>'; 21 22 while ($result_row = $result->fetchRow( )) { 23 echo "<tr><td>"; 24 echo $result_row[1] . '</td><td>'; 25 echo $result_row[4] . '</td><td>'; 26 echo $result_row[2] . '</td></tr>'; 27 } 28 29 echo("</table>"); 30 $connection->disconnect( ); 31 32 ?> 例9-7顯示的效果如圖9-7所示。 圖9-7:使用PEAR DB的函數(shù)不影響輸出 注意圖9-7跟圖9-4完全一致。 第3行沒有變化,包括數(shù)據(jù)庫登錄信息: include('db_login.php'); 第4行增加了一個新的require語句: require_once( "DB.php" ); 這行語句包含DB.php,這個文件提供了PEAR DB函數(shù)。如果沒有找到DB.php文件,函數(shù)require_once會終止代碼并返回錯誤。同時也可以避免同一個文件被包含兩次,一個文件被多次包含也會導(dǎo)致問題。 DB.php文件可以在PHP發(fā)布的pear子目錄下找到。安裝PEAR的時候應(yīng)該已經(jīng)將這個路徑添加到pph.ini文件中的include_path了。如果找不到,應(yīng)該檢查PEAR DB是否正確安裝,以及路徑是否正確設(shè)置。 DB.php文件定義了類DB。參考第5章有關(guān)使用類和對象的更多信息。我們將會主要使用這個類提供的方法。類DB有一個connect方法,我們會使用它來替換前面使用的connect函數(shù)mysql_connect。雙冒號(::)表示調(diào)用類的函數(shù),如第6行所示。 $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database" ); 當(dāng)調(diào)用connect函數(shù)的時候,它出創(chuàng)建一個新的數(shù)據(jù)庫連接,保存在變量$connection中。Connect函數(shù)試圖通過傳遞給它的連接字符串來連接數(shù)據(jù)庫。 連接字符串使用新的格式來表示登錄信息,這些信息我們已經(jīng)通過單獨(dú)的域提供: dbtype://username:password@host/database 這個格式看起來也許會有些熟悉,它跟Windows的文件共享所使用的連接字符串非常相似。字符串的第一部分phptype是將PEAR函數(shù)與一般PHP函數(shù)區(qū)分開來的關(guān)鍵部分。Phptype域指定要連接的數(shù)據(jù)庫類型,支持的數(shù)據(jù)庫包括ibase、mysql、mssql、mysql、oci8、odbc、pgsql、和sybase。如果需要使用不同類型的數(shù)據(jù)庫,你的PHP代碼只需要修改phptype. 其他的域username、password、host和database跟基本的PHP connect類似。只有連接類型是必需的,不過通常要指定所有的域。 代入了db_login.php中的數(shù)值之后,連接字符串如下所示: "mysql://test:test@localhost/test" 如果第6行的連接方法調(diào)用成功,就會創(chuàng)建一個DB對象。它包含訪問數(shù)據(jù)庫的方法和數(shù)據(jù)庫連接的所有狀態(tài)信息。 DB對象包含的一個方法是query。Query方法跟PHP的query函數(shù)非常類似,都接受一個SQL語句作為參數(shù)。區(qū)別是要使用箭頭(->)來通過對象調(diào)用函數(shù),并且它返回的結(jié)果是另外一個對象而不是結(jié)果集。 $query = "SELECT * FROM books" $result = $connection->query($query); 這個代碼在連接對象上調(diào)用query函數(shù),執(zhí)行SQL查詢,返回結(jié)果對象$result. 第22行在結(jié)果對象上調(diào)用方法fetchRow。與mysql_fetch_row類似,這個方法一次返回一行數(shù)據(jù): while ($result_row = $result->fetchRow( )) { echo 'Title: '.$result_row[1] . '<br />'; echo 'Author: '.$result_row[4] . '<br /> '; echo 'Pages: '.$result_row[2] . '<br /><br />'; } 使用一個while循環(huán)并調(diào)用fetchRow來遍歷所有行,直到fetchRow返回FALSE。 循環(huán)內(nèi)的代碼跟未使用PEAR的例子中的代碼一致。 第30行結(jié)束數(shù)據(jù)庫連接,它使用的是DB對象的disconnect方法: $connection->disconnect( ); 函數(shù)DB::isError會檢查返回的結(jié)果是不是個錯誤。如果是,可以使用DB::errorMessae得到錯誤對應(yīng)的文字描述。你需要將函數(shù)的返回值傳遞給DB:: errorMessage作為參數(shù)。 下面使用PEAR代碼重寫錯誤檢查: <?php if ( DB::isError( $demoResult = $db->query( $sql))) { echo DB::errorMessage($demoResult); } else { while ($demoRow = $demoResult->fetchRow( )) { echo $demoRow[2] . '<br />'; } } ?> PEAR數(shù)據(jù)庫接口還提供了一個新版本叫做PEAR::MDB2。例9-6給出了使用MDB2版本重寫同一個例子的代碼。 例9-8:使用PEAR::MDB2顯示表books <?php include('db_login.php'); require_once('MDB2.php'); //Translate our database login information into an array. $dsn = array( 'phptype' => 'mysql', 'username' => $username, 'password' => $password, 'hostspec' => $host, 'database' => $database ); //Create the connection as an MDB2 instance. $mdb2 = MDB2::factory($dsn); if (PEAR::isError($mdb2)) { die($mdb2->getMessage( )); } //Set the fetchmode to field associative. $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC); $query = "SELECT * FROM books NATURAL JOIN authors"; $result =$mdb2->query($query); if (PEAR::isError($result)){ die("Could not query the database:<br />$query ".$result->getMessage( )); } //Display the results. echo('<table border="1">'); echo '<tr><th>Title</th><th>Author</th><th>Pages</th></tr>'; //Loop through the result set. while ($row = $result->fetchRow( )) { echo "<tr><td>"; echo htmlentities($row['title']) . '</td><td>'; echo htmlentities($row['author ']) . '</td><td>'; echo htmlentities($row['pages']) . '</td></tr>'; } echo("</table>"); //Close the connection. $result->free( ); ?> 我們得到同樣的顯示結(jié)果。這個版本的PEAR數(shù)據(jù)庫抽象提供了更多的函數(shù)。 現(xiàn)在我們掌握了連接數(shù)據(jù)庫的方法以及PEAR提供的各種函數(shù)。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|