版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 譯文:</b></p><p> 通過(guò)PHP訪問MySQL</p><p> 現(xiàn)在你已經(jīng)可以熟練地使用MySQL客戶端軟件來(lái)操作數(shù)據(jù)庫(kù)里的數(shù)據(jù),我們也可以開始學(xué)習(xí)如何使用PHP來(lái)顯示和修改數(shù)據(jù)庫(kù)里的數(shù)據(jù)了。PHP有標(biāo)準(zhǔn)的函數(shù)用來(lái)操作數(shù)據(jù)庫(kù)。</p><p> 我們首先學(xué)習(xí)PHP內(nèi)建的數(shù)據(jù)庫(kù)函數(shù),然后會(huì)學(xué)習(xí)PH
2、P擴(kuò)展和應(yīng)用程序庫(kù)(PEAR,PHP Extension and Application Repository )中的數(shù)據(jù)庫(kù)函數(shù),我們可以使用這些函數(shù)操作所有支持的數(shù)據(jù)庫(kù)。這種靈活性源自于抽象。對(duì)于編程接口而言,抽象簡(jiǎn)化了復(fù)雜的交互過(guò)程。它將交互過(guò)程中無(wú)關(guān)緊要的部分屏蔽起來(lái),讓你關(guān)注于重要的部分。PEAR的DB類就是這樣一種數(shù)據(jù)庫(kù)接口的抽象。你登錄一個(gè)數(shù)據(jù)庫(kù)所需要提供的信息被減少到最少。這種標(biāo)準(zhǔn)的格式可以通過(guò)同一個(gè)函數(shù)來(lái)訪問MySQL以
3、及其他的數(shù)據(jù)庫(kù)。同樣,一些MySQL特定的函數(shù)被更一般的、可以用在很多數(shù)據(jù)庫(kù)上的函數(shù)所替代。比如,MySQL特定的連接函數(shù)是:</p><p> mysql_connect($db_host, $db_username, $db_password);</p><p> 而PEAR的DB提供的連接函數(shù)是:</p><p> $connection = DB::c
4、onnect("mysql://$db_username:$db_password@$db_host/$db_database");</p><p> 兩個(gè)命令都提供了同樣的基本信息,但是PEAR的函數(shù)中還指定了要連接的數(shù)據(jù)庫(kù)的類型。你可以連接到MySQL或者其他支持的數(shù)據(jù)庫(kù)。我們會(huì)詳細(xì)討論這兩種連接方式。</p><p> 本章中,我們會(huì)學(xué)習(xí)如何從PHP連接到My
5、SQL的服務(wù)器,如何使用PHP訪問數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),以及如何正確的向用戶顯示信息。</p><p><b> 步驟</b></p><p> 無(wú)論是通過(guò)MySQL命令行工具,還是通過(guò)PHP,執(zhí)行一個(gè)查詢的基本步驟都是一樣的:</p><p><b> ? 連接到數(shù)據(jù)庫(kù)</b></p><p>
6、; ? 選擇要使用的數(shù)據(jù)庫(kù)</p><p> ? 創(chuàng)建SELECT語(yǔ)句</p><p><b> ? 執(zhí)行查詢</b></p><p><b> ? 顯示結(jié)果</b></p><p> 我們將逐一介紹如何用PHP和PEAR的函數(shù)完成上面的每一步。</p><p>&
7、lt;b> 資源</b></p><p> 當(dāng)連接到MySQL數(shù)據(jù)庫(kù)的時(shí)候,你會(huì)使用到兩個(gè)新的資源。第一個(gè)是連接的標(biāo)識(shí)符,它記錄了一個(gè)活動(dòng)連接用來(lái)連接到數(shù)據(jù)庫(kù)所必需的所有信息。另外一個(gè)資源是結(jié)果資源,它包含了用來(lái)從一個(gè)有效的數(shù)據(jù)庫(kù)查詢結(jié)果中取出結(jié)果所需要的所有信息。本章中我們會(huì)創(chuàng)建并使用這兩種資源。</p><p> 使用PHP函數(shù)查詢數(shù)據(jù)庫(kù)</p>
8、<p> 本節(jié)我們會(huì)介紹如何使用PHP連接MySQL數(shù)據(jù)庫(kù)。這非常簡(jiǎn)單,我們會(huì)用一些例子說(shuō)明。但是之前我們應(yīng)該稍微了解一下幕后發(fā)生的事情。當(dāng)你試圖連接一個(gè)MySQL數(shù)據(jù)庫(kù)的時(shí)候,MySQL服務(wù)器會(huì)根據(jù)你的用戶名和密碼進(jìn)行身份認(rèn)證。PHP為你建立數(shù)據(jù)庫(kù)的連接,你可以立即開始查詢并得到結(jié)果。</p><p> 我們需要同樣的信息來(lái)連接數(shù)據(jù)庫(kù):</p><p> ? 數(shù)據(jù)庫(kù)服務(wù)器
9、的IP地址</p><p><b> ? 數(shù)據(jù)庫(kù)的名字</b></p><p><b> ? 用戶名</b></p><p><b> ? 密碼</b></p><p> 在開始之前,首先使用MySQL的命令行客戶端確認(rèn)你登錄到數(shù)據(jù)庫(kù)。</p><p
10、> 圖9-1顯示了數(shù)據(jù)庫(kù)交互過(guò)程的各個(gè)步驟和兩種類型資源之間的關(guān)系。創(chuàng)建SELECT語(yǔ)句發(fā)生在第三個(gè)函數(shù)調(diào)用之前,但是在圖中沒有顯示出來(lái)。它是通過(guò)普通的PHP代碼,而不是MySQL特定的PHP函數(shù)完成的。</p><p> 圖9-1:使用數(shù)據(jù)庫(kù)時(shí)函數(shù)和資源之間的交互</p><p><b> 包含數(shù)據(jù)庫(kù)登錄細(xì)節(jié)</b></p><p&g
11、t; 我們先創(chuàng)建一個(gè)文件,用來(lái)保存登錄MySQL所用到的信息。我們建議你把這些信息放在單獨(dú)的文件里然后通過(guò)include來(lái)使用這個(gè)文件。這樣一來(lái)如果你修改了數(shù)據(jù)庫(kù)的密碼。無(wú)論有多少個(gè)PHP文件訪問數(shù)據(jù)庫(kù),你只需要修改這一個(gè)文件。</p><p> 假設(shè)這個(gè)文件的名字叫做db_login.php,并且它跟其他所用PHP文件放在同一個(gè)目錄下。這個(gè)文件的內(nèi)容如例9-1所示。</p><p>
12、 例9-1:設(shè)置數(shù)據(jù)庫(kù)登錄的配置文件模板</p><p><b> <?php</b></p><p> $db_host='hostname of database server';</p><p> $db_database='database name';</p><p&g
13、t; $db_username='username';</p><p> $db_password='password';</p><p><b> ?></b></p><p> 在例9-2中,我們創(chuàng)建的文件使用跟Web服務(wù)器放在同一臺(tái)機(jī)器上的數(shù)據(jù)庫(kù),并指定的數(shù)據(jù)庫(kù)的名字,用戶名和密碼。</
14、p><p> 例9-2:db_login.php文件示例</p><p><b> <?php</b></p><p> $db_host='localhost';</p><p> $db_database='test';</p><p> $db_u
15、sername='test';</p><p> $db_password='yourpass';</p><p><b> ?></b></p><p> 圖9-2顯示了如何在其他PHP文件中使用這個(gè)文件。我們會(huì)繼續(xù)使用在第七章中創(chuàng)建的數(shù)據(jù)庫(kù)。</p><p> 圖9-2:
16、在多文件中重復(fù)使用登錄信息</p><p> 例9-3是精簡(jiǎn)后的,用mysqldump命令得到的重建這個(gè)數(shù)據(jù)庫(kù)的SQL命令。</p><p> 例9-3:重建測(cè)試數(shù)據(jù)庫(kù)的SQL語(yǔ)句</p><p> DROP TABLE IF EXISTS books;</p><p> CREATE TABLE books (</p>
17、<p> title_id int(11) NOT NULL auto_increment,</p><p> title varchar(150) default NULL,</p><p> pages int(11) default NULL,</p><p> PRIMARY KEY (title_id)</p><p
18、> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;</p><p><b> --</b></p><p> -- Dumping data for table books</p><p><b> --</b></p><p> INSERT INT
19、O books VALUES (1,'Linux in a Nutshell',476),(2,'Classic Shell Scripting',256);</p><p><b> --</b></p><p> -- Table structure for table purchases</p><p>
20、;<b> --</b></p><p> DROP TABLE IF EXISTS purchases;</p><p> CREATE TABLE purchases ( </p><p> id int(11) NOT NULL auto_increment, </p><p> user varchar
21、(10) default NULL, </p><p> title varchar(150) default NULL, </p><p> day date default NULL,</p><p> PRIMARY KEY (id)</p><p> ) ENGINE=MyISAM DEFAULT CHARSET=latin1
22、;</p><p><b> --</b></p><p> -- Dumping data for table purchases</p><p><b> --</b></p><p> LOCK TABLES purchases WRITE;</p><p>
23、 INSERT INTO purchases VALUES (1,'Mdavis','Regular Expression Pocket Reference','2005-02-15'),(2,'Mdavis','JavaScript & DHTML Cookbook','2005-02-10');</p><p&
24、gt; 如果你在第8章中沒有創(chuàng)建這些表,可以將例9-3中的代碼保存成文件backup.sql,然后在命令行執(zhí)行命令,命令格式如下:</p><p> mysql -u username -ppassword -D database_name < backup_file_name.sql</p><p> 如果使用例子中的值,那么這個(gè)命令就是:</p><p&
25、gt; mysql -u test -pyourpass -D test < backup.sql</p><p> 數(shù)據(jù)庫(kù)的名字叫test,它包含三個(gè)表,分別是books、authors和purchases。每個(gè)表都有一些示例記錄。這些就足以讓我們開始使用PHP來(lái)進(jìn)行查詢了。</p><p><b> 連接到數(shù)據(jù)庫(kù)</b></p><
26、p> 我們需要做的頭一件事情是連接數(shù)據(jù)庫(kù),并且檢查連接是否確實(shí)建立起來(lái)。如例9-4所示,通過(guò)include包含連接信息的文件,我們可以在調(diào)用mysql_connect函數(shù)的時(shí)候使用這些變量而不是將這些值寫死在代碼中。我們使用一個(gè)叫做db_test.php的文件,往其中增加這些代碼段。</p><p> 例9-4:在db_test.php中包含連接參數(shù)和調(diào)用mysql_connect</p>
27、<p> // Include our login information</p><p> include('db_login.php');</p><p> // Connect</p><p> $connection = mysql_connect($db_host, $db_username, $db_password)
28、;</p><p> if (!$connection){</p><p> die ("Could not connect to the database: <br />". mysql_error( ));</p><p><b> }</b></p><p> 函數(shù)mysql
29、_connect的參數(shù)是數(shù)據(jù)庫(kù)服務(wù)器主機(jī)、用戶名和密碼。如果連接成功,就會(huì)返回新建立的連接,如果不能建立連接就會(huì)返回FALSE。檢查這個(gè)函數(shù)的返回值來(lái)確保連接的確建立起來(lái)了。如果遇到問題,比如不正確的密碼,可以使用mysql_error打印一條友好的警告信息以及導(dǎo)致錯(cuò)誤的原因。</p><p> 請(qǐng)注意我們還沒有指定數(shù)據(jù)庫(kù)的名字。</p><p><b> 診斷連接錯(cuò)誤<
30、;/b></p><p> 你可能遇到的一個(gè)錯(cuò)誤是:</p><p> Fatal error: Call to undefined function mysql_connect( ) in C:\Program Files\Apache</p><p> Software Foundation\Apache2.2\htdocs\db_test.php
31、on line 4</p><p> 這個(gè)錯(cuò)誤發(fā)生的原因是下載安裝的PHP5.x默認(rèn)沒有包括對(duì)MySQL的支持。解決這個(gè)問題需要將php_mysql.dll文件從PHP壓縮包例的ext/目錄復(fù)制到C:/php,并修改C:\WINDOWS\php.ini文件,確保下面兩行沒有被注釋掉(注釋的方法在行首使用分號(hào))。</p><p> extension_dir = "c:/PHP
32、/ext/"</p><p> extension=php_mysql.dll</p><p> 這樣PHP擴(kuò)展的目錄就被設(shè)為C:\PHP,MySQL的擴(kuò)展也會(huì)被使用。在編輯php.ini文件的時(shí)候,你可以使用編輯器的搜索功能來(lái)檢查這兩行是否已經(jīng)存在,只是需要去掉注釋,并且需要重新輸入。</p><p> 重新啟動(dòng)Apache,這樣MySQL的支持就
33、會(huì)被打開了。</p><p><b> 選擇數(shù)據(jù)庫(kù)</b></p><p> 建立連接之后,下一步就是使用mysql_select_db來(lái)選擇我們要用的數(shù)據(jù)庫(kù)。它的參數(shù)有兩個(gè):數(shù)據(jù)庫(kù)名和可選的數(shù)據(jù)庫(kù)連接。如果不指定數(shù)據(jù)庫(kù)連接,默認(rèn)使用上一條mysql_connect所建立的連接。</p><p> // Select the databa
34、se</p><p> $db_select=mysql_select_db($db_database);</p><p> if (!$db_select)</p><p><b> {</b></p><p> die ("Could not select the database: <br
35、/>". mysql_error( ));</p><p><b> }</b></p><p> 同樣的,每次訪問數(shù)據(jù)庫(kù)的時(shí)候最好能檢查可能的錯(cuò)誤并且進(jìn)行顯示。</p><p> 現(xiàn)在我們做好了一切準(zhǔn)備工作,可以開始執(zhí)行SQL查詢了。</p><p> 構(gòu)建SQL SELECT查詢</p&
36、gt;<p> 構(gòu)建SQL查詢非常容易就是將一個(gè)字符串賦值給變量。這個(gè)字符串就是我們的SQL查詢,當(dāng)然我們要給出有效的SQL查詢,否則執(zhí)行這個(gè)查詢的時(shí)候MySQL會(huì)返回錯(cuò)誤。我們使用$query作為變量名,這個(gè)名字對(duì)應(yīng)其目的,你也可以選擇任何你喜歡的變量名。這個(gè)例子中的SQL查詢是”SELECT * FROM books”。</p><p> 你可以使用字符串連接操作符(.)來(lái)構(gòu)建查詢:<
37、/p><p> // Assign the query</p><p> $select = ' SELECT ';</p><p> $column = ' * ';</p><p> $from = ' FROM ';</p><p> $tables =
38、39; books ';</p><p> $where = ' NATURAL JOIN authors';</p><p> $query = $select.$column.$from.$tables.$where;</p><p> 這個(gè)版本的代碼比下面的代碼要靈活多了:</p><p> // Ass
39、ign the query</p><p> $query = "SELECT * FROM books NATURAL JOIN authors";</p><p> 查詢字符串也可以在WHERE子句中使用變量來(lái)限定返回什么樣的行,這些變量可能是用戶信息,也可能是來(lái)自其他的查詢。</p><p> 現(xiàn)在我們已經(jīng)將查詢賦值給了一個(gè)變量,下一
40、步就是執(zhí)行它。</p><p><b> 執(zhí)行查詢</b></p><p> 使用mysql_query函數(shù)來(lái)告訴數(shù)據(jù)庫(kù)執(zhí)行查詢。它有兩個(gè)參數(shù):查詢和可選的數(shù)據(jù)庫(kù)連接,返回值是查詢結(jié)果。我們將查詢結(jié)果保存在一個(gè)變量里,也許你已經(jīng)猜到我們要用變量名就是$result。這里同樣有必要檢查mysql_query的返回值不是FALSE來(lái)確保查詢字符串和數(shù)據(jù)庫(kù)連接都沒有問題
41、。</p><p> // Execute the query</p><p> $result = mysql_query( $query );</p><p> if (!$result){</p><p> die ("Could not query the database: <br />".
42、mysql_error( ));</p><p><b> }</b></p><p> 當(dāng)數(shù)據(jù)庫(kù)查詢的時(shí)候,所有的結(jié)果構(gòu)成一個(gè)結(jié)果集。這些結(jié)果跟使用mysql命令行客戶端執(zhí)行同樣查詢所得到的行一致。要顯示這些結(jié)果,你需要依次處理這些行。</p><p><b> 取結(jié)果并顯示</b></p><
43、p> 使用mysql_fetch_row從結(jié)果集中取出一行,它的用法如下:</p><p> array mysql_fetch_row ( resource $result);</p><p> 它的參數(shù)是SQL查詢返回的結(jié)果,我們將結(jié)果保存在$result中。每次調(diào)用它返回一行數(shù)據(jù),直到?jīng)]有數(shù)據(jù)為止,這時(shí)候它返回FALSE。這樣,我們可以使用一個(gè)循環(huán),在循環(huán)內(nèi)調(diào)用mysql
44、_fetch_row并使用一些代碼來(lái)顯示每一行。</p><p> // Fetch and display the results</p><p> while ($result_row = mysql_fetch_row(($result))){</p><p> echo 'Title: '.$result_row[1] . '&
45、lt;br />';</p><p> echo 'Author: '.$result_row[4] . '<br /> ';</p><p> echo 'Pages: '.$result_row[2] . '<br /><br />';</p><p
46、><b> }</b></p><p> 結(jié)果行的所有列都保存在一個(gè)數(shù)組里,可以方便地進(jìn)行訪問。變量$result_row[2]訪問結(jié)果行的第二個(gè)屬性(數(shù)組的順序是查詢是定義的列的順序,如果使用SELECE * ,那么數(shù)組順序就是表的列的順序)。</p><p><b> 取結(jié)果的方式</b></p><p>
47、 去結(jié)果的方式不止一種。使用mysql_fetch_arrry可以一次性將所有結(jié)果放在一個(gè)數(shù)組里。它的參數(shù)是查詢結(jié)果和一個(gè)可選的結(jié)果綁定方式。如果綁定方式指定為MYSQL_ASSOC,數(shù)組中的結(jié)果則使用查詢中列的名字進(jìn)行訪問。如果指定了MYSQL_NUM,那么就使用從0開始的數(shù)字來(lái)訪問結(jié)果。默認(rèn)使用的方式是MYSQL_BOTH,這樣返回的數(shù)組支持兩種類型的訪問。Mysql_fetch_assoc是使用MYSQL_ASSOC取結(jié)果的另外
48、一種方式。</p><p> 用mysql_fetch_array加上MYSQL_ASSOC的方式重寫上面的代碼,如下所示:</p><p> // Fetch and display the results</p><p> while ($result_row = mysql_fetch_array($result, MYSQL_ASSOC)){</
49、p><p> echo 'Title: '.$result_row['title'] . '<br />';</p><p> echo 'Author: '.$result_row['author'] . '<br /> ';</p><p>
50、 echo 'Pages: '.$result_row['pages'] . '<br /><br />';</p><p><b> }</b></p><p><b> 關(guān)閉連接</b></p><p> 絕大部分情況下,我們?cè)谑褂猛暌粋€(gè)數(shù)據(jù)
51、庫(kù)之后要關(guān)閉到它的連接。使用mysql_close來(lái)關(guān)閉一個(gè)數(shù)據(jù)庫(kù),它會(huì)告訴PHP和MySQL這個(gè)數(shù)據(jù)庫(kù)連接已經(jīng)不再使用,所使用的所有資源和內(nèi)存都可以釋放。</p><p> mysql_close($connection)</p><p><b> 使用PEAR</b></p><p> PEAR是一個(gè)框架和可重用PHP組建的發(fā)布系統(tǒng),
52、它為PHP開發(fā)提供了一套增強(qiáng)的功能,PEAR包括很多種模塊,用來(lái)處理從會(huì)話管理到購(gòu)物車功能的幾乎所有事情。表9-1列出了現(xiàn)有的模塊種類。</p><p> 表9-1:PEAR模塊種類</p><p> Authentication HTML &
53、#160; Processing</p><p> Benchmarking HTTP
54、160; Science</p><p> Caching Images
55、60; Semantic Web</p><p> Configuration Internationalization
56、60; Streams</p><p> Console Logging
57、60; Structures</p><p> Database Mail
58、160; System</p><p> Date/Time Math
59、0; Test</p><p> Encryption Networking &
60、#160; Tools and utilities</p><p> Event Numbers
61、60; Validate</p><p> File formats Payment
62、60; Web services</p><p> File system PEAR
63、0; XML</p><p> GTK components PHP</p><p> 我們的列表還不夠完整,可以訪問http://pear.php.net來(lái)獲得供下載的所有模塊。</p><p><b>
64、安裝</b></p><p> PEAR使用包管理器來(lái)管理安裝PEAR模塊。是否需要安裝包管理取決于你所使用的PHP版本。如果你使用的版本是PHP4.4.0或者更新的版本,那么就已經(jīng)安裝了包管理器。如果你使用的是PHP5.0,則PEAR是一個(gè)單獨(dú)的包。我們要用到的DB包是可選的,但是它會(huì)被包管理器默認(rèn)安裝。所以,如果你有包管理器,那么就全搞定了。</p><p><b&
65、gt; UNIX</b></p><p> 在UNIX系統(tǒng)下,可以通過(guò)在shell(命令行)下執(zhí)行下面的命令來(lái)安裝包管理器:lynx -source http://go-pear.org/ | php</p><p> 這個(gè)命令使用go-pear.org的輸出(實(shí)際就是PHP源代碼)來(lái)安裝PEAR,go-pear.org的輸出被傳給php命令執(zhí)行。</p>
66、<p><b> Windows</b></p><p> 安裝完P(guān)HP5后,會(huì)有一個(gè)PEAR安裝腳本C:\php\go-pear.bat。如果你在第二章沒有安裝所以文件,那么現(xiàn)在把所有的PHP文件都解壓到C:\php下,然后執(zhí)行這個(gè)批處理文件。</p><p> 圖9-5顯示執(zhí)行PEAR安裝程序后的初始屏幕。</p><p>
67、 圖9-5:go-pear.bat安裝腳本</p><p> 安裝程序會(huì)要求輸入幾個(gè)路徑,你可以使用默認(rèn)值。那樣安裝的最上級(jí)目錄就是c:\php.</p><p> PEAR安裝程序會(huì)創(chuàng)建文件C:\php\PEAR_ENV.reg,雙擊該文件在注冊(cè)表中設(shè)置PEAR的路徑。這個(gè)文件的內(nèi)容視安裝的PEAR版本而定。當(dāng)彈出對(duì)話框要求確認(rèn)的時(shí)候,點(diǎn)擊OK將信息加入注冊(cè)表。</p>
68、<p> 在執(zhí)行完這個(gè)批處理文件后,你可能需要編輯php.ini文件,將PEAR的目錄加入到include_path中。Php.ini的447行看起來(lái)如下:</p><p> include_path = ".;c:\php\includes;c:\php\PEAR"</p><p> Apache必須重啟才能使用DB包。</p>&l
69、t;p><b> 托管ISP</b></p><p> 大部分人的ISP都安裝了PEAR DB。如果你的ISP沒有提供,可以要求他們安裝。你可以通過(guò)執(zhí)行例9-8中的代碼來(lái)判斷PEAR DB是否已經(jīng)安裝,如果沒有,那么在執(zhí)行這個(gè)腳本的時(shí)候“require_once(‘DB.php’)”這一行就會(huì)報(bào)錯(cuò)。</p><p><b> 增加額外的包<
70、/b></p><p> 完成上面的步驟之后,你可以通過(guò)在命令行輸入“pear”來(lái)運(yùn)行PEAR的包管理器。增加新的模塊非常容易,只需要執(zhí)行“pear packagename”就可以了。你不需要安裝DB模塊,因?yàn)樵诎惭b包管理器的時(shí)候它已經(jīng)默認(rèn)安裝了。</p><p> 不過(guò)如果你運(yùn)行的是Windows XP Home ,需要執(zhí)行下面的步驟來(lái)安裝PEAR DB:</p>
71、<p> C:\>cd c:\php</p><p> C:\>pear install DB</p><p> C:\>pear list</p><p> 找出安裝PEAR包的版本,執(zhí)行pear list。這個(gè)命令返回一個(gè)列表,如圖9-6所示:</p><p> 圖9-6:安裝的PEAR包和版本列表
72、</p><p> 一旦安裝完P(guān)EAR,我們就可以開始使用它了。</p><p> 用PEAR重寫B(tài)ooks例子</p><p> 使用PEAR DB包的時(shí)候,執(zhí)行的步驟和使用PHP函數(shù)是類似。不過(guò),函數(shù)的用法有細(xì)微的不同。我們會(huì)逐行解釋兩者的差別,如例9-7所示。</p><p> 例9-7:用PEAR DB 顯示books表<
73、;/p><p><b> 1 <?php</b></p><p><b> 2</b></p><p> 3 include('db_login.php');</p><p> 4 require_once('DB.php');</p><
74、;p><b> 5</b></p><p> 6 $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");</p><p><b> 7</b></p><p> 8 if (
75、DB::isError($connection)){</p><p> 9 die("Could not connect to the database: <br />".DB::errorMessage($connection));</p><p><b> 10 }</b></p><p><b&g
76、t; 11</b></p><p> 12 $query = "SELECT * FROM books NATURAL JOIN authors";</p><p> 13 $result = $connection->query($query);</p><p><b> 14</b></p
77、><p> 15 if (DB::isError($result)){</p><p> 16 die("Could not query the database:<br />$query ".DB::errorMessage($result));</p><p><b> 17 }</b></p>
78、<p><b> 18</b></p><p> 19 echo('<table border="1">');</p><p> 20 echo '<tr><th>Title</th><th>Author</th><th>
79、Pages</th></tr>';</p><p><b> 21</b></p><p> 22 while ($result_row = $result->fetchRow( )) {</p><p> 23 echo "<tr><td>";</p
80、><p> 24 echo $result_row[1] . '</td><td>';</p><p> 25 echo $result_row[4] . '</td><td>';</p><p> 26 echo $result_row[2] . '</td>&l
81、t;/tr>';</p><p><b> 27 }</b></p><p><b> 28</b></p><p> 29 echo("</table>");</p><p> 30 $connection->disconnect( );
82、</p><p><b> 31</b></p><p><b> 32 ?></b></p><p> 例9-7顯示的效果如圖9-7所示。</p><p> 圖9-7:使用PEAR DB的函數(shù)不影響輸出</p><p> 注意圖9-7跟圖9-4完全一致。&l
83、t;/p><p> 第3行沒有變化,包括數(shù)據(jù)庫(kù)登錄信息:</p><p> include('db_login.php');</p><p> 第4行增加了一個(gè)新的require語(yǔ)句:</p><p> require_once( "DB.php" );</p><p> 這行
84、語(yǔ)句包含DB.php,這個(gè)文件提供了PEAR DB函數(shù)。如果沒有找到DB.php文件,函數(shù)require_once會(huì)終止代碼并返回錯(cuò)誤。同時(shí)也可以避免同一個(gè)文件被包含兩次,一個(gè)文件被多次包含也會(huì)導(dǎo)致問題。</p><p><b> 創(chuàng)建連接示例</b></p><p> DB.php文件定義了類DB。參考第5章有關(guān)使用類和對(duì)象的更多信息。我們將會(huì)主要使用這個(gè)類提供
85、的方法。類DB有一個(gè)connect方法,我們會(huì)使用它來(lái)替換前面使用的connect函數(shù)mysql_connect。雙冒號(hào)(::)表示調(diào)用類的函數(shù),如第6行所示。</p><p> $connection = DB::connect("mysql://$db_username:$db_password@$db_host/$db_database");</p><p>
86、 當(dāng)調(diào)用connect函數(shù)的時(shí)候,它出創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接,保存在變量$connection中。Connect函數(shù)試圖通過(guò)傳遞給它的連接字符串來(lái)連接數(shù)據(jù)庫(kù)。</p><p><b> 連接字符串</b></p><p> 連接字符串使用新的格式來(lái)表示登錄信息,這些信息我們已經(jīng)通過(guò)單獨(dú)的域提供:</p><p> dbtype://use
87、rname:password@host/database</p><p> 這個(gè)格式看起來(lái)也許會(huì)有些熟悉,它跟Windows的文件共享所使用的連接字符串非常相似。字符串的第一部分phptype是將PEAR函數(shù)與一般PHP函數(shù)區(qū)分開來(lái)的關(guān)鍵部分。Phptype域指定要連接的數(shù)據(jù)庫(kù)類型,支持的數(shù)據(jù)庫(kù)包括ibase、mysql、mssql、mysql、oci8、odbc、pgsql、和sybase。如果需要使用不同類
88、型的數(shù)據(jù)庫(kù),你的PHP代碼只需要修改phptype.</p><p> 其他的域username、password、host和database跟基本的PHP connect類似。只有連接類型是必需的,不過(guò)通常要指定所有的域。</p><p> 代入了db_login.php中的數(shù)值之后,連接字符串如下所示:</p><p> "mysql://tes
89、t:test@localhost/test"</p><p> 如果第6行的連接方法調(diào)用成功,就會(huì)創(chuàng)建一個(gè)DB對(duì)象。它包含訪問數(shù)據(jù)庫(kù)的方法和數(shù)據(jù)庫(kù)連接的所有狀態(tài)信息。</p><p><b> 查詢</b></p><p> DB對(duì)象包含的一個(gè)方法是query。Query方法跟PHP的query函數(shù)非常類似,都接受一個(gè)SQL語(yǔ)句
90、作為參數(shù)。區(qū)別是要使用箭頭(->)來(lái)通過(guò)對(duì)象調(diào)用函數(shù),并且它返回的結(jié)果是另外一個(gè)對(duì)象而不是結(jié)果集。</p><p> $query = "SELECT * FROM books"</p><p> $result = $connection->query($query);</p><p> 這個(gè)代碼在連接對(duì)象上調(diào)用query函數(shù)
91、,執(zhí)行SQL查詢,返回結(jié)果對(duì)象$result.</p><p><b> 取結(jié)果</b></p><p> 第22行在結(jié)果對(duì)象上調(diào)用方法fetchRow。與mysql_fetch_row類似,這個(gè)方法一次返回一行數(shù)據(jù):</p><p> while ($result_row = $result->fetchRow( )) {<
92、/p><p> echo 'Title: '.$result_row[1] . '<br />';</p><p> echo 'Author: '.$result_row[4] . '<br /> ';</p><p> echo 'Pages: '.$res
93、ult_row[2] . '<br /><br />';</p><p><b> }</b></p><p> 使用一個(gè)while循環(huán)并調(diào)用fetchRow來(lái)遍歷所有行,直到fetchRow返回FALSE。</p><p> 循環(huán)內(nèi)的代碼跟未使用PEAR的例子中的代碼一致。</p>
94、<p><b> 關(guān)閉</b></p><p> 第30行結(jié)束數(shù)據(jù)庫(kù)連接,它使用的是DB對(duì)象的disconnect方法:</p><p> $connection->disconnect( );</p><p><b> PEAR錯(cuò)誤報(bào)告</b></p><p> 函數(shù)DB
95、::isError會(huì)檢查返回的結(jié)果是不是個(gè)錯(cuò)誤。如果是,可以使用DB::errorMessae得到錯(cuò)誤對(duì)應(yīng)的文字描述。你需要將函數(shù)的返回值傳遞給DB::errorMessage作為參數(shù)。</p><p> 下面使用PEAR代碼重寫錯(cuò)誤檢查:</p><p><b> <?php</b></p><p> if ( DB::isErr
96、or( $demoResult = $db->query( $sql)))</p><p><b> {</b></p><p> echo DB::errorMessage($demoResult);</p><p><b> } else</b></p><p><b>
97、 {</b></p><p> while ($demoRow = $demoResult->fetchRow( ))</p><p><b> {</b></p><p> echo $demoRow[2] . '<br />';</p><p><b>
98、 }</b></p><p><b> }</b></p><p><b> ?></b></p><p> PEAR數(shù)據(jù)庫(kù)接口還提供了一個(gè)新版本叫做PEAR::MDB2。例9-6給出了使用MDB2版本重寫同一個(gè)例子的代碼。</p><p> 例9-8:使用PEAR::MD
99、B2顯示表books</p><p><b> <?php</b></p><p> include('db_login.php');</p><p> require_once('MDB2.php');</p><p> //Translate our database l
100、ogin information into an array.</p><p> $dsn = array(</p><p> 'phptype' => 'mysql',</p><p> 'username' => $username,</p><p> 'pass
101、word' => $password,</p><p> 'hostspec' => $host,</p><p> 'database' => $database</p><p><b> );</b></p><p> //Create the con
102、nection as an MDB2 instance.</p><p> $mdb2 = MDB2::factory($dsn);</p><p> if (PEAR::isError($mdb2)) {</p><p> die($mdb2->getMessage( ));</p><p><b> }</b
103、></p><p> //Set the fetchmode to field associative.</p><p> $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);</p><p> $query = "SELECT * FROM books NATURAL JOIN authors"
104、;</p><p> $result =$mdb2->query($query);</p><p> if (PEAR::isError($result)){</p><p> die("Could not query the database:<br />$query ".$result->getMessage(
105、));</p><p><b> }</b></p><p> //Display the results.</p><p> echo('<table border="1">');</p><p> echo '<tr><th>Ti
106、tle</th><th>Author</th><th>Pages</th></tr>';</p><p> //Loop through the result set.</p><p> while ($row = $result->fetchRow( )) {</p><p>
107、; echo "<tr><td>";</p><p> echo htmlentities($row['title']) . '</td><td>';</p><p> echo htmlentities($row['author ']) . '</td&
108、gt;<td>';</p><p> echo htmlentities($row['pages']) . '</td></tr>';</p><p><b> }</b></p><p> echo("</table>");<
109、;/p><p> //Close the connection.</p><p> $result->free( );</p><p><b> ?></b></p><p> 我們得到同樣的顯示結(jié)果。這個(gè)版本的PEAR數(shù)據(jù)庫(kù)抽象提供了更多的函數(shù)。</p><p> 現(xiàn)在我們掌握
110、了連接數(shù)據(jù)庫(kù)的方法以及PEAR提供的各種函數(shù)。</p><p><b> 原文: </b></p><p> Getting PHP to Talk to MySQl</p><p> Now that you’re comfortable using the MySQL client tools to manipulate d
111、ata in the database, you can begin using PHP to display and modify data from the database. PHP has standard functions for working with the database.First, we’re going to discuss PHP’s built-in database functions. We’ll a
112、lso show you how to use the The PHP Extension and Application Repository (PEAR) database</p><p> functions that provide the ability to use the same functions to access any supported database. This type of f
113、lexibility comes from a process called abstraction. In programming interfaces, abstraction simplifies a complex interaction. It works by</p><p> removing any nonessential parts of the interaction, allowing
114、you to concentrate on the important parts. PEAR’s DB classes are one such database interface abstraction. The information you need to log into a database is reduced to the bare minimum. This standard format allows you to
115、 interact with MySQL, as well as other databases using the same functions. Similarly, other MySQL-specific functions are replaced with generic ones that know how to talk to many databases. For example, the MySQL-specifi&
116、lt;/p><p> mysql_connect($db_host, $db_username, $db_password);</p><p> versus PEAR’s DB connect function:</p><p> $connection = DB::connect("mysql://$db_username:$db_password@
117、$db_host/$db_database");</p><p> The same basic information is present in both commands, but the PEAR function also specifies the type of databases to which to connect. You can connect to MySQL or othe
118、r supported databases. We’ll discuss both connection methods in detail.</p><p> In this chapter, you’ll learn how to connect to a MySQL server fromPHP, how to use PHP to access and retrieve stored data, and
119、 how to correctly display information to the user.</p><p> The Process</p><p> The basic steps of performing a query, whether using the mysql command-line tool or PHP, are the same:</p>
120、<p> ? Connect to the database.</p><p> ? Select the database to use.</p><p> ? Build a SELECT statement.</p><p> ? Perform the query.</p><p> ? Display the
121、results.</p><p> We’ll walk through each of these steps for both plain PHP and PEAR functions.</p><p><b> Resources</b></p><p> When connecting to a MySQL database, y
122、ou will use two new resources. The first is the link identifier that holds all of the information necessary to connect to the database for an active connection. The other resource is the results resource. It contains all
123、 information required to retrieve results from an active database query’s result set. You’ll be creating and assigning both resources in this chapter.</p><p> Querying the Database with PHP Functions</p&
124、gt;<p> In this section, we introduce how to connect to a MySQL database with PHP. It’s quite simple, and we’ll begin shortly with examples, but we should talk briefly about what actually happens. When you try co
125、nnecting to a MySQL database, the MySQL server authenticates you based on your username and password. PHP handles connecting</p><p> to the database for you, and it allows you to start performing queries an
126、d gathering data immediately.</p><p> As in Chapter 8, we’ll need the same pieces of information to connect to the database:</p><p> ? The IP address of the database server</p><p>
127、; ? The name of the database</p><p> ? The username</p><p> ? The password</p><p> Before moving on, make sure you can log into your database using the MySQL command-line client
128、.</p><p> Figure 9-1 shows how the steps of the database interaction relate to the two types of resources. Building the SELECT statement happens before the third function call, but it is not shown. It’s don
129、e with plain PHP code, not a MySQL-specific PHP function.</p><p> Figure 9-1. The interaction between functions and resources when using the database</p><p> Including Database Login Details&l
130、t;/p><p> You’re going to create a file to hold the information for logging into MySQL. Storing this information in a file you include is recommended. If you change the database password, there is only one pla
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- php訪問mysql(畢業(yè)設(shè)計(jì)外文翻譯)
- php畢業(yè)設(shè)計(jì)外文翻譯--通過(guò)php訪問mysql
- php訪問mysql(畢業(yè)論文_外文翻譯)
- 外文翻譯---通過(guò)php訪問mysql
- 計(jì)算機(jī)外文翻譯---基于php和mysql的網(wǎng)站設(shè)計(jì)和實(shí)現(xiàn)
- 計(jì)算機(jī)畢業(yè)設(shè)計(jì)外文翻譯
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯
- 計(jì)算機(jī)畢業(yè)設(shè)計(jì)論文-基于php+mysql的企業(yè)圖書管理系統(tǒng)
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)-外文翻譯
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯27
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯--internet
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文資料翻譯3
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)-外文翻譯--matlab 介紹
- 計(jì)算機(jī)畢業(yè)設(shè)計(jì)外文翻譯---數(shù)據(jù)倉(cāng)庫(kù)
- php與mysql程序設(shè)計(jì)【外文翻譯】
- 116計(jì)算機(jī)專業(yè)相關(guān)有關(guān)畢業(yè)設(shè)計(jì)外文文獻(xiàn)翻譯安裝和配置mysql (最新)
- 計(jì)算機(jī)畢業(yè)設(shè)計(jì)---業(yè)務(wù)管理系統(tǒng)設(shè)計(jì)(含外文翻譯)
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文文獻(xiàn)翻譯部分
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯--jsp內(nèi)置對(duì)象
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)外文翻譯--數(shù)據(jù)庫(kù)
評(píng)論
0/150
提交評(píng)論