版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 譯文:</b></p><p> 通過PHP訪問MySQL</p><p> 現(xiàn)在你已經(jīng)可以熟練地使用MySQL客戶端軟件來操作數(shù)據(jù)庫里的數(shù)據(jù),我們也可以開始學(xué)習(xí)如何使用PHP來顯示和修改數(shù)據(jù)庫里的數(shù)據(jù)了。PHP有標準的函數(shù)用來操作數(shù)據(jù)庫。</p><p> 我們首先學(xué)習(xí)PHP內(nèi)建的數(shù)據(jù)庫函數(shù),然后會學(xué)習(xí)PH
2、P擴展和應(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ù)庫所需要提供的信息被減少到最少。這種標準的格式可以通過同一個函數(shù)來訪問MySQL以
3、及其他的數(shù)據(jù)庫。同樣,一些MySQL特定的函數(shù)被更一般的、可以用在很多數(shù)據(jù)庫上的函數(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> 兩個命令都提供了同樣的基本信息,但是PEAR的函數(shù)中還指定了要連接的數(shù)據(jù)庫的類型。你可以連接到MySQL或者其他支持的數(shù)據(jù)庫。我們會詳細討論這兩種連接方式。</p><p> 本章中,我們會學(xué)習(xí)如何從PHP連接到My
5、SQL的服務(wù)器,如何使用PHP訪問數(shù)據(jù)庫中存儲的數(shù)據(jù),以及如何正確的向用戶顯示信息。</p><p><b> 步驟</b></p><p> 無論是通過MySQL命令行工具,還是通過PHP,執(zhí)行一個查詢的基本步驟都是一樣的:</p><p><b> ? 連接到數(shù)據(jù)庫</b></p><p>
6、; ? 選擇要使用的數(shù)據(jù)庫</p><p> ? 創(chuàng)建SELECT語句</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ù)庫的時候,你會使用到兩個新的資源。第一個是連接的標識符,它記錄了一個活動連接用來連接到數(shù)據(jù)庫所必需的所有信息。另外一個資源是結(jié)果資源,它包含了用來從一個有效的數(shù)據(jù)庫查詢結(jié)果中取出結(jié)果所需要的所有信息。本章中我們會創(chuàng)建并使用這兩種資源。</p><p> 使用PHP函數(shù)查詢數(shù)據(jù)庫</p>
8、<p> 本節(jié)我們會介紹如何使用PHP連接MySQL數(shù)據(jù)庫。這非常簡單,我們會用一些例子說明。但是之前我們應(yīng)該稍微了解一下幕后發(fā)生的事情。當(dāng)你試圖連接一個MySQL數(shù)據(jù)庫的時候,MySQL服務(wù)器會根據(jù)你的用戶名和密碼進行身份認證。PHP為你建立數(shù)據(jù)庫的連接,你可以立即開始查詢并得到結(jié)果。</p><p> 我們需要同樣的信息來連接數(shù)據(jù)庫:</p><p> ? 數(shù)據(jù)庫服務(wù)器
9、的IP地址</p><p><b> ? 數(shù)據(jù)庫的名字</b></p><p><b> ? 用戶名</b></p><p><b> ? 密碼</b></p><p> 在開始之前,首先使用MySQL的命令行客戶端確認你登錄到數(shù)據(jù)庫。</p><p
10、> 圖9-1顯示了數(shù)據(jù)庫交互過程的各個步驟和兩種類型資源之間的關(guān)系。創(chuàng)建SELECT語句發(fā)生在第三個函數(shù)調(diào)用之前,但是在圖中沒有顯示出來。它是通過普通的PHP代碼,而不是MySQL特定的PHP函數(shù)完成的。</p><p> 圖9-1:使用數(shù)據(jù)庫時函數(shù)和資源之間的交互</p><p><b> 包含數(shù)據(jù)庫登錄細節(jié)</b></p><p&g
11、t; 我們先創(chuàng)建一個文件,用來保存登錄MySQL所用到的信息。我們建議你把這些信息放在單獨的文件里然后通過include來使用這個文件。這樣一來如果你修改了數(shù)據(jù)庫的密碼。無論有多少個PHP文件訪問數(shù)據(jù)庫,你只需要修改這一個文件。</p><p> 假設(shè)這個文件的名字叫做db_login.php,并且它跟其他所用PHP文件放在同一個目錄下。這個文件的內(nèi)容如例9-1所示。</p><p>
12、 例9-1:設(shè)置數(shù)據(jù)庫登錄的配置文件模板</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ù)器放在同一臺機器上的數(shù)據(jù)庫,并指定的數(shù)據(jù)庫的名字,用戶名和密碼。</
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文件中使用這個文件。我們會繼續(xù)使用在第七章中創(chuàng)建的數(shù)據(jù)庫。</p><p> 圖9-2:
16、在多文件中重復(fù)使用登錄信息</p><p> 例9-3是精簡后的,用mysqldump命令得到的重建這個數(shù)據(jù)庫的SQL命令。</p><p> 例9-3:重建測試數(shù)據(jù)庫的SQL語句</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> 如果使用例子中的值,那么這個命令就是:</p><p&
25、gt; mysql -u test -pyourpass -D test < backup.sql</p><p> 數(shù)據(jù)庫的名字叫test,它包含三個表,分別是books、authors和purchases。每個表都有一些示例記錄。這些就足以讓我們開始使用PHP來進行查詢了。</p><p><b> 連接到數(shù)據(jù)庫</b></p><
26、p> 我們需要做的頭一件事情是連接數(shù)據(jù)庫,并且檢查連接是否確實建立起來。如例9-4所示,通過include包含連接信息的文件,我們可以在調(diào)用mysql_connect函數(shù)的時候使用這些變量而不是將這些值寫死在代碼中。我們使用一個叫做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ù)庫服務(wù)器主機、用戶名和密碼。如果連接成功,就會返回新建立的連接,如果不能建立連接就會返回FALSE。檢查這個函數(shù)的返回值來確保連接的確建立起來了。如果遇到問題,比如不正確的密碼,可以使用mysql_error打印一條友好的警告信息以及導(dǎo)致錯誤的原因。</p><p> 請注意我們還沒有指定數(shù)據(jù)庫的名字。</p><p><b> 診斷連接錯誤<
30、;/b></p><p> 你可能遇到的一個錯誤是:</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> 這個錯誤發(fā)生的原因是下載安裝的PHP5.x默認沒有包括對MySQL的支持。解決這個問題需要將php_mysql.dll文件從PHP壓縮包例的ext/目錄復(fù)制到C:/php,并修改C:\WINDOWS\php.ini文件,確保下面兩行沒有被注釋掉(注釋的方法在行首使用分號)。</p><p> extension_dir = "c:/PHP
32、/ext/"</p><p> extension=php_mysql.dll</p><p> 這樣PHP擴展的目錄就被設(shè)為C:\PHP,MySQL的擴展也會被使用。在編輯php.ini文件的時候,你可以使用編輯器的搜索功能來檢查這兩行是否已經(jīng)存在,只是需要去掉注釋,并且需要重新輸入。</p><p> 重新啟動Apache,這樣MySQL的支持就
33、會被打開了。</p><p><b> 選擇數(shù)據(jù)庫</b></p><p> 建立連接之后,下一步就是使用mysql_select_db來選擇我們要用的數(shù)據(jù)庫。它的參數(shù)有兩個:數(shù)據(jù)庫名和可選的數(shù)據(jù)庫連接。如果不指定數(shù)據(jù)庫連接,默認使用上一條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ù)庫的時候最好能檢查可能的錯誤并且進行顯示。</p><p> 現(xiàn)在我們做好了一切準備工作,可以開始執(zhí)行SQL查詢了。</p><p> 構(gòu)建SQL SELECT查詢</p&
36、gt;<p> 構(gòu)建SQL查詢非常容易就是將一個字符串賦值給變量。這個字符串就是我們的SQL查詢,當(dāng)然我們要給出有效的SQL查詢,否則執(zhí)行這個查詢的時候MySQL會返回錯誤。我們使用$query作為變量名,這個名字對應(yīng)其目的,你也可以選擇任何你喜歡的變量名。這個例子中的SQL查詢是”SELECT * FROM books”。</p><p> 你可以使用字符串連接操作符(.)來構(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> 這個版本的代碼比下面的代碼要靈活多了:</p><p> // Ass
39、ign the query</p><p> $query = "SELECT * FROM books NATURAL JOIN authors";</p><p> 查詢字符串也可以在WHERE子句中使用變量來限定返回什么樣的行,這些變量可能是用戶信息,也可能是來自其他的查詢。</p><p> 現(xiàn)在我們已經(jīng)將查詢賦值給了一個變量,下一
40、步就是執(zhí)行它。</p><p><b> 執(zhí)行查詢</b></p><p> 使用mysql_query函數(shù)來告訴數(shù)據(jù)庫執(zhí)行查詢。它有兩個參數(shù):查詢和可選的數(shù)據(jù)庫連接,返回值是查詢結(jié)果。我們將查詢結(jié)果保存在一個變量里,也許你已經(jīng)猜到我們要用變量名就是$result。這里同樣有必要檢查mysql_query的返回值不是FALSE來確保查詢字符串和數(shù)據(jù)庫連接都沒有問題
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ù)庫查詢的時候,所有的結(jié)果構(gòu)成一個結(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ù)為止,這時候它返回FALSE。這樣,我們可以使用一個循環(huán),在循環(huán)內(nèi)調(diào)用mysql
44、_fetch_row并使用一些代碼來顯示每一行。</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é)果行的所有列都保存在一個數(shù)組里,可以方便地進行訪問。變量$result_row[2]訪問結(jié)果行的第二個屬性(數(shù)組的順序是查詢是定義的列的順序,如果使用SELECE * ,那么數(shù)組順序就是表的列的順序)。</p><p><b> 取結(jié)果的方式</b></p><p>
47、 去結(jié)果的方式不止一種。使用mysql_fetch_arrry可以一次性將所有結(jié)果放在一個數(shù)組里。它的參數(shù)是查詢結(jié)果和一個可選的結(jié)果綁定方式。如果綁定方式指定為MYSQL_ASSOC,數(shù)組中的結(jié)果則使用查詢中列的名字進行訪問。如果指定了MYSQL_NUM,那么就使用從0開始的數(shù)字來訪問結(jié)果。默認使用的方式是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> 絕大部分情況下,我們在使用完一個數(shù)據(jù)
51、庫之后要關(guān)閉到它的連接。使用mysql_close來關(guān)閉一個數(shù)據(jù)庫,它會告訴PHP和MySQL這個數(shù)據(jù)庫連接已經(jīng)不再使用,所使用的所有資源和內(nèi)存都可以釋放。</p><p> mysql_close($connection)</p><p><b> 使用PEAR</b></p><p> PEAR是一個框架和可重用PHP組建的發(fā)布系統(tǒng),
52、它為PHP開發(fā)提供了一套增強的功能,PEAR包括很多種模塊,用來處理從會話管理到購物車功能的幾乎所有事情。表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來獲得供下載的所有模塊。</p><p><b>
64、安裝</b></p><p> PEAR使用包管理器來管理安裝PEAR模塊。是否需要安裝包管理取決于你所使用的PHP版本。如果你使用的版本是PHP4.4.0或者更新的版本,那么就已經(jīng)安裝了包管理器。如果你使用的是PHP5.0,則PEAR是一個單獨的包。我們要用到的DB包是可選的,但是它會被包管理器默認安裝。所以,如果你有包管理器,那么就全搞定了。</p><p><b&
65、gt; UNIX</b></p><p> 在UNIX系統(tǒng)下,可以通過在shell(命令行)下執(zhí)行下面的命令來安裝包管理器:lynx -source http://go-pear.org/ | php</p><p> 這個命令使用go-pear.org的輸出(實際就是PHP源代碼)來安裝PEAR,go-pear.org的輸出被傳給php命令執(zhí)行。</p>
66、<p><b> Windows</b></p><p> 安裝完P(guān)HP5后,會有一個PEAR安裝腳本C:\php\go-pear.bat。如果你在第二章沒有安裝所以文件,那么現(xiàn)在把所有的PHP文件都解壓到C:\php下,然后執(zhí)行這個批處理文件。</p><p> 圖9-5顯示執(zhí)行PEAR安裝程序后的初始屏幕。</p><p>
67、 圖9-5:go-pear.bat安裝腳本</p><p> 安裝程序會要求輸入幾個路徑,你可以使用默認值。那樣安裝的最上級目錄就是c:\php.</p><p> PEAR安裝程序會創(chuàng)建文件C:\php\PEAR_ENV.reg,雙擊該文件在注冊表中設(shè)置PEAR的路徑。這個文件的內(nèi)容視安裝的PEAR版本而定。當(dāng)彈出對話框要求確認的時候,點擊OK將信息加入注冊表。</p>
68、<p> 在執(zhí)行完這個批處理文件后,你可能需要編輯php.ini文件,將PEAR的目錄加入到include_path中。Php.ini的447行看起來如下:</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沒有提供,可以要求他們安裝。你可以通過執(zhí)行例9-8中的代碼來判斷PEAR DB是否已經(jīng)安裝,如果沒有,那么在執(zhí)行這個腳本的時候“require_once(‘DB.php’)”這一行就會報錯。</p><p><b> 增加額外的包<
70、/b></p><p> 完成上面的步驟之后,你可以通過在命令行輸入“pear”來運行PEAR的包管理器。增加新的模塊非常容易,只需要執(zhí)行“pear packagename”就可以了。你不需要安裝DB模塊,因為在安裝包管理器的時候它已經(jīng)默認安裝了。</p><p> 不過如果你運行的是Windows XP Home ,需要執(zhí)行下面的步驟來安裝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。這個命令返回一個列表,如圖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包的時候,執(zhí)行的步驟和使用PHP函數(shù)是類似。不過,函數(shù)的用法有細微的不同。我們會逐行解釋兩者的差別,如例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ù)庫登錄信息:</p><p> include('db_login.php');</p><p> 第4行增加了一個新的require語句:</p><p> require_once( "DB.php" );</p><p> 這行
84、語句包含DB.php,這個文件提供了PEAR DB函數(shù)。如果沒有找到DB.php文件,函數(shù)require_once會終止代碼并返回錯誤。同時也可以避免同一個文件被包含兩次,一個文件被多次包含也會導(dǎo)致問題。</p><p><b> 創(chuàng)建連接示例</b></p><p> DB.php文件定義了類DB。參考第5章有關(guān)使用類和對象的更多信息。我們將會主要使用這個類提供
85、的方法。類DB有一個connect方法,我們會使用它來替換前面使用的connect函數(shù)mysql_connect。雙冒號(::)表示調(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ù)的時候,它出創(chuàng)建一個新的數(shù)據(jù)庫連接,保存在變量$connection中。Connect函數(shù)試圖通過傳遞給它的連接字符串來連接數(shù)據(jù)庫。</p><p><b> 連接字符串</b></p><p> 連接字符串使用新的格式來表示登錄信息,這些信息我們已經(jīng)通過單獨的域提供:</p><p> dbtype://use
87、rname:password@host/database</p><p> 這個格式看起來也許會有些熟悉,它跟Windows的文件共享所使用的連接字符串非常相似。字符串的第一部分phptype是將PEAR函數(shù)與一般PHP函數(shù)區(qū)分開來的關(guān)鍵部分。Phptype域指定要連接的數(shù)據(jù)庫類型,支持的數(shù)據(jù)庫包括ibase、mysql、mssql、mysql、oci8、odbc、pgsql、和sybase。如果需要使用不同類
88、型的數(shù)據(jù)庫,你的PHP代碼只需要修改phptype.</p><p> 其他的域username、password、host和database跟基本的PHP connect類似。只有連接類型是必需的,不過通常要指定所有的域。</p><p> 代入了db_login.php中的數(shù)值之后,連接字符串如下所示:</p><p> "mysql://tes
89、t:test@localhost/test"</p><p> 如果第6行的連接方法調(diào)用成功,就會創(chuàng)建一個DB對象。它包含訪問數(shù)據(jù)庫的方法和數(shù)據(jù)庫連接的所有狀態(tài)信息。</p><p><b> 查詢</b></p><p> DB對象包含的一個方法是query。Query方法跟PHP的query函數(shù)非常類似,都接受一個SQL語句
90、作為參數(shù)。區(qū)別是要使用箭頭(->)來通過對象調(diào)用函數(shù),并且它返回的結(jié)果是另外一個對象而不是結(jié)果集。</p><p> $query = "SELECT * FROM books"</p><p> $result = $connection->query($query);</p><p> 這個代碼在連接對象上調(diào)用query函數(shù)
91、,執(zhí)行SQL查詢,返回結(jié)果對象$result.</p><p><b> 取結(jié)果</b></p><p> 第22行在結(jié)果對象上調(diào)用方法fetchRow。與mysql_fetch_row類似,這個方法一次返回一行數(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> 使用一個while循環(huán)并調(diào)用fetchRow來遍歷所有行,直到fetchRow返回FALSE。</p><p> 循環(huán)內(nèi)的代碼跟未使用PEAR的例子中的代碼一致。</p>
94、<p><b> 關(guān)閉</b></p><p> 第30行結(jié)束數(shù)據(jù)庫連接,它使用的是DB對象的disconnect方法:</p><p> $connection->disconnect( );</p><p><b> PEAR錯誤報告</b></p><p> 函數(shù)DB
95、::isError會檢查返回的結(jié)果是不是個錯誤。如果是,可以使用DB::errorMessae得到錯誤對應(yīng)的文字描述。你需要將函數(shù)的返回值傳遞給DB::errorMessage作為參數(shù)。</p><p> 下面使用PEAR代碼重寫錯誤檢查:</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ù)庫接口還提供了一個新版本叫做PEAR::MDB2。例9-6給出了使用MDB2版本重寫同一個例子的代碼。</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é)果。這個版本的PEAR數(shù)據(jù)庫抽象提供了更多的函數(shù)。</p><p> 現(xiàn)在我們掌握
110、了連接數(shù)據(jù)庫的方法以及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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- php訪問mysql(畢業(yè)設(shè)計外文翻譯)
- php畢業(yè)設(shè)計外文翻譯--通過php訪問mysql
- php訪問mysql(畢業(yè)論文_外文翻譯)
- 外文翻譯---通過php訪問mysql
- 計算機外文翻譯---基于php和mysql的網(wǎng)站設(shè)計和實現(xiàn)
- 計算機畢業(yè)設(shè)計外文翻譯
- 計算機專業(yè)畢業(yè)設(shè)計外文翻譯
- 計算機畢業(yè)設(shè)計論文-基于php+mysql的企業(yè)圖書管理系統(tǒng)
- 計算機專業(yè)畢業(yè)設(shè)計-外文翻譯
- 計算機專業(yè)畢業(yè)設(shè)計外文翻譯27
- 計算機專業(yè)畢業(yè)設(shè)計外文翻譯--internet
- 計算機專業(yè)畢業(yè)設(shè)計外文資料翻譯3
- 計算機專業(yè)畢業(yè)設(shè)計-外文翻譯--matlab 介紹
- 計算機畢業(yè)設(shè)計外文翻譯---數(shù)據(jù)倉庫
- php與mysql程序設(shè)計【外文翻譯】
- 116計算機專業(yè)相關(guān)有關(guān)畢業(yè)設(shè)計外文文獻翻譯安裝和配置mysql (最新)
- 計算機畢業(yè)設(shè)計---業(yè)務(wù)管理系統(tǒng)設(shè)計(含外文翻譯)
- 計算機專業(yè)畢業(yè)設(shè)計外文文獻翻譯部分
- 計算機專業(yè)畢業(yè)設(shè)計外文翻譯--jsp內(nèi)置對象
- 計算機專業(yè)畢業(yè)設(shè)計外文翻譯--數(shù)據(jù)庫
評論
0/150
提交評論