本文介紹堪稱Web資料庫黃金組合的PHP/MySQL如何構築一個網路資料庫應用的方法,PHP是一個類似微軟ASP的伺服器端的嵌入式超文字處理語言,是建立動態網站的強大工具。
而MySQL是一個輕型SQL資料庫伺服器,可運行在多種平臺上,包括Windows NT和Linux,它還有一個GPL版本,MySQL被認為是建立資料庫驅動的動態網站的最佳產品。 PHP、MySQL和Apache是Linux平臺網站的最佳拍檔。 該教程是一個3日課程,從安裝到應用都有詳細描述。
一、PHP/MySQL簡介
您應該聽說過開放原始碼軟體(OSS),除非最近六到八個月來您一直住在火星上。 這場運動有著巨大的衝擊力,已引起一些大公司的注意。 象Oralce、Informix,還有多家公司都開始把他們的主力資料庫產品移植到OSS的產物之一 - Linux作業系統上。
如果您有足夠的技術力量,擁有一個複雜龐大的關係資料庫系統(RDBMS)則是如虎添翼。 但是也許您對資料庫還剛剛入門,您剛剛讀了Jay的文章,決定自己也來搞一個資料驅動的網站。 可是您也許會發現您缺乏必要的資源來運行ASP伺服器或昂貴的資料庫系統(您也不需要這些東西)。 您需要一些免費的、支援Unix的東西。
那麼我建議您使用PHP和MySQL。 這兩樣東西加在一起,對於開發資料驅動的網站這項工作而言,真是最佳組合。 其實用不著我多費唇舌解釋。 一項由Netcraft組織的非官方調查顯示,應用PHP的主機數目由1998年6月的7,500台躍升至1999年3月的410,000台。 不錯吧? 這兩種軟體的組合還在Webcon98大會上贏得了年度資料庫產品大獎,還得了一座漂亮的獎盃。
MySQL是一個小巧靈瓏的資料庫伺服器軟體,對於小型(當然也不一定很小)應用系統是非常理想的。 除了支援標準的ANSI SQL語句,它還支援多種平臺,而在Unix系統上該軟體支援多執行緒運行方式,從而能獲得相當好的性能。 對於不使用Unix的使用者,它可以在Windows NT系統上以系統服務方式運行,或者在Windows 95/98系統上以普通進程方式運行。
PHP是一種伺服器端解釋的指令碼語言。 如果你接觸過ASP的話,那麼您對於在HTML頁面中嵌入代碼應該是比較熟悉了。 PHP代碼在伺服器一端被解釋轉變成普通的HTML頁面內容,送給瀏覽器一端。 這種模式使得我們可以用它來完成相當複雜的功能。
除了免費這一點(當然,MySQL也有一些使用許可方面的限制),PHP-MySQL的組合還可以跨平臺運行,這意味著您可以在Windows上開發,然後在Unix平臺上運行 磽猓琍HP也能作為標準的CGI進程來運行, 此時它是一個獨立的腳本解譯器,或者是Apache的一個嵌入模組
如果您有興趣使用其他資料庫伺服器的話,PHP也支援Informix、Oracle、Sybase、Solid和PostgreSQL ,以及通用的ODBC。
PHP支援Internet開發的一些前沿技術。 這些技術包括身份認證、XML、動態圖像生成、WDDX、共用記憶體,以及動態PDF文檔等等,不一而足。 如果您還不滿意的話,PHP是很容易擴展的,所以只要您有程式設計能力,您盡可以自己大展身手一番。
最後要說的是,兩種軟體都是大量程式師協同開發的,因此文檔及郵寄清單等支援方式很多。 程式錯誤的修正很快,而如果您要求加入新功能的話,總會有人考慮您的要求,並且在可行性足夠高的前提下加以實現。
說得夠多了! 我們來看看這篇教程裡都有些什麼內容吧。
第一課講的是在Unix和Windows環境下安裝這兩個軟體。 如果您不太關心這個問題(也許您是在ISP的伺服器上開發),您可以直接跳到第一個示常式序,從那裡開始您的奇妙之旅。
在第二課裡,我們要學習一些更加複雜的腳本功能,比如迴圈、處理使用者輸入,以及與資料庫交換資料等等。
第三課要講的是確認功能,以及如何使您的腳本程式清晰簡練。
我們開始吧
二、安裝MySQL
快點行動,拿到這些套裝軟體,仔細研究一下吧。 這可不是件容易的事兒。 你從獲取套裝軟體、編譯套裝軟體到安裝套裝軟體的過程中都有不少的選擇項。 我們先從MySQL開始,因為有了它才能運行PHP。
MySQL中央網站是HTTP://www.mysql.com/。 為了方便人們下載使用(這軟體還是比較大的),全球有許許多多的鏡像網站。 為更有效地利用網際網路,請找一個就近的網站下載。
在這時候你也會有多種選擇。 如果你是發燒友的話,可以下載原始程式碼;否則,網上也有各種平臺上運行的預先編譯過的二進位檔案可以直接下載。
另外,MySQL還為Windows使用者準備了一個共用軟體版本,它的版本號稍低一些。 如果你想要最新的版本,得花錢買一個軟體許可。 MySQL還提供了ODBC驅動程式,使前端應用程式可以訪問MySQL資料庫。 有關其他一些詳細資訊在它的網站上都有得介紹,您可以去看看。
預先編譯過的Unix版本和Windows版本都很簡單,只須解包即可使用,不需要做太多說明了。 因此,我們來介紹一下原始程式碼的編譯。 Windows使用者請記住,您需要運行mysqld程式,該程式是在mysql/bin目錄下。
下載壓縮過的套裝軟體檔,放在一個目錄下。 使用gzip和tar來解壓縮和解包。 比較快的做法是使用下面這樣的命令:
gunzip $#@60; mysql-xxxx.tar.gz | tar xvf -
其中,xxxx是你自己任取的一個版本戳記。 上面的命令將創建一個名為mysql-xxxx目錄,所有的來源程式檔都在這個目錄下。 通過執行cd mysql-xxxx命令轉入該目錄,仔細閱讀其中的多個README檔INSTALL檔。 在遇到某些問題時,這些檔可能會幫上大忙呢。
MySQL帶有一些便利的配置腳本程式。 只須簡單地鍵入./configure,您就可以讓這些程式為您完成很多工作。 如果您需要明確指定要做的事情,可以使用./configure -help命令,它會給您列出你可以使用的選項。 例如,如果您正在一台記憶體較少的機器上進行編譯,那麼可以使用--with-low-memory選項。 我喜歡把MySQL安裝在一個總目錄下,而不是安裝在機器上多個目錄下,所以我會指定安裝目錄,並指定-prefix選項。
您還可以指定許多其他選項,象編譯過程中要略掉哪些部分、保留哪些部分等。 我們不妨假定要全部安裝在伺服器的/usr/local/mysql目錄下。 這意味著我們將鍵入./configure -prefix=/usr/local/mysql命令。
配置腳本程式運行時會檢查您的系統,然後生成一些檔來保證編譯的順利進行。 如果該腳本程式失敗,它也會顯示一些有用的錯誤資訊告訴您失敗的原因。 大家經常會遇到腳本程式在尋找多執行緒庫檔時失敗。 此時您應當檢查一下系統中是否已經安裝了MIT-pthreads,如果沒有,那麼請您安裝該軟體。 Linux使用者則必須安裝LinuxThreads。 這些庫檔對於MySQL的多執行緒運行模式(也就是運行它自己的多個版本〕是非常關鍵的。
如果一切都順利進行的話,只須簡單鍵入make命令,然後就可以去泡杯咖啡了。 MySQL是相當複雜的程式,編譯起來得用一段時間。 如果發現錯誤,可以檢查文檔,看看只否您漏掉了某些與您的作業系統有關的準備工作。
接下來,鍵入make install命令,所有必需的檔都會安裝到相應的目錄。 您差不多就可以開始使用了! 如果您是MySQL新手,以前從未安裝過MySQL,那您得創建預設的許可許可權才能安裝,因此請鍵入...scripts/mysql_install_db來進行相應的設置。
就這樣。 我們的準備工作完成了。 再下面所要做的就是在機器啟動時自動啟動資料庫,並在關機時自動關閉資料庫。 是的,這項工作也有一個專門的腳本程式。 mysql.server start命令可以啟動資料庫,而mysql.server stop可以關閉資料庫。 實在是再簡單不過了。 如果您想手動啟動資料庫(這樣就不用重啟機器了),你以進到安裝MySQL的最上層目錄(/usr/local/mysql)然後鍵入bin/safe_mysqld &命令。
我們已經完成了一半了。 接下來是PHP部分。
三、安裝PHP
好,看到這裡時,希望您已經把MySQL安裝好並運行起來了。 那實在是太有意思了! 下面是PHP... 這個過程要容易一些,不過那些大量的選項還是使人眼花繚亂。 當然,您大可不必驚慌。 您隨時可以重頭再來,重新編譯PHP,根據需要來加入或去掉某個選項。
PHP的老家在HTTP://www.php.net/。 這個網站資訊量極大,從開發專案內容到軟體錯誤報表都有。 和MySQL一樣,您可以選一個離您最近的鏡像網站下載。 很顯然,您得到網站的Downloads部分去下載PHP。
這裡您的選擇不是很多。 有一些預選編譯好的二進位檔案,但那都是實驗性的。 如果您不是在Windows平臺上,那就下載原始程式碼,自己編譯一下吧。
但是我們還是先談談Windows。 在使用PHP時,一般的作法是在Windows系統上開發,然後在Unix伺服器上運行。 您最終可能也會選擇這種方式,這就需要您對兩種平臺下的安裝都很熟悉才行。
下載Windows二進位檔案後,您可以用您喜歡的任何一種ZIP解壓縮程式,把套裝軟體中的檔解壓到C盤的php3目錄下。 套裝軟體中的README檔對安裝過程中的細節作了部分說明,但是我們在這裡再對這個檔中的關鍵內容做個讀者文摘:如果您不想把PHP安裝在C:php3目錄,而是別的目錄,那麼您得編輯解壓縮出來的檔中那個.inf檔。
在php3目錄中,您會發現很多.dll檔。 把所有檔案名不是以php_開頭的那些.dll檔都移到windowssystem目錄下。 然後,把php.ini-dist檔改一下名,改成php3.ini,並把它移到windows目錄下。 如果您打開這個檔,會發現裡面有很多有趣的東西可以改。 現在,把含有:
extension=php3_mysql.dll
內容的那一行的注釋去掉。
如果您使用的是Win32平臺上的Apache伺服器,那麼請設置Apache,使其能夠識別並解釋PHP檔。 您需要在HTTP.conf檔或是srm.conf檔(具體是哪一個檔取決於您使用的Apache軟體的版本)中加入下一行:
Action application/x-HTTPd-php3 "php3/php.exe"
AddType application/x-HTTPd-php3 .php3
或者,如果您使用的是IIS,那麼請用滑鼠右鍵按一下php_iis_reg.inf檔,並選擇「安裝」。 您得重新開機系統,才能使剛才所做的改動生效。
OK,說完了Windows,再來說說Unix。 當然,我們要從原始程式碼開始編譯。 與MySQL相似,把原始檔案下載、解包。 PHP也同樣包含一個配置腳本程式,可是您不能完全使用預設設置。 運行./configure -help | more命令,可以逐頁地觀看有哪些新的、有趣的選項。 您必須選擇是把PHP編譯成外部CGI程式還是Apache內嵌模組。 如果您正在使用Apache Web伺服器,並且您可以對它進行重新編譯的話,請選擇內嵌模組方式,這種方式運行更快,使用也更簡便。 否則,您可以選CGI方式。 另外,您還得指定將對MySQL的支援部分編譯進去
現在我們假定要以內嵌模組方式編譯,並帶有MySQL支援部分。 如果隨後您需要增加其他選項或庫檔的話,可以在以後再加進去。 鍵入下面的命令:
./configure -with-apache=/path/to/apache/dir -with-mysql=/usr/local/mysql
如果您打算以外部CGI程式方式來編譯的話,請去掉-with-apache選項。 配置程式運行起來後,會創建相應的系統檔。 接下來簡單地執行make命令就行了。
又可以喝一杯咖啡了。 如果您在此時感到坐立不安的話,不必擔心。 每個人在初次安裝PHP的時候都有一點近不及待的感覺。 再多喝點咖啡就是了。
如果您選擇CGI程式方式來編譯,那麼現在可以就可以使用了。 只須把產生的可執行檔案複製到CGI程式目錄下就行了。 如果您使用Apache內嵌模組方式來編譯,要再執行一下make install命令,把有關檔案複製到Apache目錄下。 在該目錄下,您可以按照Apache的文檔說明,向其中加入PHP模組,並重新編譯Apache。
現在您得告訴Web伺服器如何通過PHP程式來處理頁面內容。 如果您使用的不是Apache,那您需要查閱Web伺服器軟體的文檔,看看如何讓它處理尾碼是.php3的檔。 Apache1.3.x版本的使用者僅須在HTTPd.conf或srm.conf檔中加入:AddType application/x-HTTPd-php3.php3。 如果您使用的是CGI程式方式,那您在AddType前面還得加入下面內容:
Action application/x-HTTPd-php3 "php3/php.exe
就是這樣。 您的運氣還不那麼差,現在MySQL也運行起來了,PHP也工作正常了。
既然我們已經進行了這麼多,下面我們可以實際操練了。
四、第一個腳本
如果我告訴您真正難過的一關已經過了,您一定會很高興。 軟體的安裝過程總是無法預料,因為系統跟系統之間可以說是千差萬別。 不過您運氣不錯,資料庫運行起來,PHP也編譯安裝完畢,Web伺服器也可以正確處理副檔名為.php3的檔了。
我們下面就開始正式上路,要寫第一個腳本程式了。 創建一個文字檔,在其中加入下面的內容:
$myvar = "Hello World";
echo $myvar;
?>
現在,訪問相應的URL,例如,HTTP://myserver/test.php3。 您應該可以看到頁面中包含「Hello World」的文字。 如果您看到的是錯誤資訊,查一下PHP文檔,看看軟體設置是否正確無誤。
就是這樣了! 這是您的第一個PHP程式。 如果您查看一下這個頁面的HTML原始程式碼,您會發現裡面只有Hello World 這樣的文字。
那是因為PHP引擎過濾了檔內容,對其中的代碼作了處理,轉換成了標準的HTML。
在上面的程式中您最先注意到的可能是定界符,也就是以表示代碼結束。 PHP的強大之處在于,這些代碼可以以多種不同方式放在任意位置 - 我是說任意位置。 後面我們會看到一些很有趣的例子,現在我們還是從最簡單的開始。 如果您願意,也可以設置PHP,讓它使用短標記,,但這與XML會發生衝突,所以要小心使用。 如果您是從ASP轉向PHP,您甚至可以讓PHP使用作為定界符。
您還會注意到每行後面的分號。 這些分號稱為分隔符號,用於分隔不同的指令。 您可以把所有的PHP代碼寫在一行裡,用分隔符號把命令分開。 但是那樣看起來很亂,所以我們在每個分號後面都另起一行。 記住,每行最後都要以分號結束。
最後,您會注意到myvar這個字以$符號開頭。 這個符號告訴PHP,這是一個變數。 我們把「Hello World」賦給變數$myvar。 一個變數可以是數位,也可以是陣列。 不管怎樣,所有的變數都是以$符開頭。
PHP真正強大之處來源於它的函數。 函數,基本上是處理指示序列。 如果您把所有的選件都編譯進PHP,總共會有超過700個函數。 這些函數可以讓您做很多事情。
現在我們再加進一些MySQL的內容進去。 >>
五、裝載資料庫
現在,我們要加入MySQL的內容了。 要想知道PHP中包含哪些選項,或伺服器方面的一些情況,一種簡便的方法是使用函數phpinfo()。 創建一個象下面這樣的程式:
phpinfo();
?>
保存這個程式,在瀏覽器中訪問這個檔。 您會看到網頁中包含了一些有趣的、有用的資訊,象這樣。 這些資訊是有關伺服器、Web伺服器內部環境變數、PHP中包含的選項,等等。 在第一段Extensions中,找到以MySQL開頭的一行。 如果沒有找到,那說明MySQL支援選項並沒有編譯進PHP。 您可以再檢查一下安裝步驟,查閱一下PHP文檔,看您是否漏掉了什麼。
如果找到了MySQL那一行,那您可以繼續了。
從MySQL資料庫中讀取資料之前,我們得先往資料庫裡放一些資料。 在現在這一階段,還沒有一個簡便的方法來做這件事情。 大多數的PHP程式都帶有一個資料檔案,該檔包含一些資料來創建並啟動MySQL資料庫。 這個過程不在本教程範圍之內,所以讓我來替您做這件事情吧。
MySQL使用它自己的使用者許可權表。 在安裝時,會創建一個預設的使用者(root),該使用者是沒有口令的。 資料庫管理員可以根據需要來增加使用者並賦予使用者各種不同的許可權,但這項工作完全可以另寫一本書了,所以我們只使用root使用者。 如果您自己管理伺服器和資料庫,為root使用者分配一個口令是很重要的。
總之,我們還是接著說資料庫吧。 對Win32使用者來說,很對不起,不過您要在DOS下做些工作。 您不得不使用DOS視窗,或者在「執行」視窗中鍵入所有命令。 別忘了,輸入命令時要帶上MySQL/bin的目錄名。 Unix使用者可以在MySQL的bin目錄下輸入命令,但命令必須以./開頭,才能讓程式運行起來。
我們要做的第一件事情是實際創建出資料庫。 在命令列下,鍵入下列命令: mysqladmin -u root create mydb 這樣就創建了一個名為「mydb」的資料庫。 -u選項告訴MySQL我們使用的是root使用者。
下一步,我們要加入一些資料,這裡我們用的示例資料是大家都喜歡用的員工資料庫。 我們將會用到我前面提到過的資料檔案。 如果您想在這方面多瞭解一些,可以查閱MySQL所帶的手冊或訪問 HTTP://www.turbolift.com/mysql/網站。
把下面的文字複製到一個檔中,把該檔存在MySQL的bin目錄下(我假定檔案名是mydb.dump)。
CREATE TABLE employees ( id Tinyint(4) DEFAULT ‘0‘ NOT Null
AUTO_INCREMENT, first Varchar(20), last Varchar(20),
address Varchar(255), position Varchar(50), PRIMARY KEY (id),
UNIQUE id (id));INSERT INTO employees VALUES (1,‘Bob‘,‘Smith‘,
‘128 Here St, Cityname‘,‘Marketing Manager‘);
INSERT INTO employees VALUES (2,‘John‘,‘Roberts‘,‘45 There St ,
Townville‘,‘Telephonist‘);
INSERT INTO employees VALUES (3,‘Brad‘,‘Johnson‘,‘1/34 Nowhere Blvd,
Snowston‘,‘Doorman‘);
如果文字是折行的,請確保每一個INSERT語句都是另起一行的。 現在,我們要把資料加入到mydb資料庫中了。 在命令列下,鍵入下面的命令:
mysql -u root mydb < mydb.dump
此時您應該不會遇到什麼錯誤。 如果真的出錯了,請仔細檢查一下是否因上面的文字折行而引起錯誤。 >>
六、測試
OK,現在我們已經把資料導入到資料庫中了。 現在我們來處理這些資料。 把下面的文字存入一個檔中,把該檔存在Web伺服器的文檔目錄下,尾碼名為.php3。
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
printf("First Name: %s
", mysql_result($result,0,"first"));
printf("Last Name: %s
", mysql_result($result,0,"last"));
printf("Address: %s
", mysql_result($result,0,"address"));
printf("Position: %s
", mysql_result($result,0,"position"));
?>
我來解釋一下上面的代碼。 mysql_connect()函數負責以指定的使用者名(本例中使用者名是root)連接到指定機器(在本例中機器是本機localhost)上的MySQL資料庫。 如果您想指定使用者口令,您也可以把它送給這個函數。 連接的結果保存在變數$db中。
隨後,mysql_select_db()函數告訴PHP,我們要讀取的資料庫是mydb。 我們可以在程式中同時連接到多台機器上的多個資料庫,但目前我們還是限於連接一個資料庫。
接下來,mysql_query()函數完成最複雜的部分。 利用剛才得到的連接結果標識,該函數把一行SQL語句送給MySQL伺服器去處理。 返回的結果保存在變數$result中。
最後,mysql_result()函數顯示SQL查詢命令所得到的各個欄位的值。 利用變數$result,我們就可以找到第一條記錄,記錄號是0,並將其中各欄位的值顯示出來。
如果您以前沒用過Perl或C語言,那麼printf函數的語法格式會顯得很奇怪。 在上面的每一行程式中,%s代表運算式第二部分中的那個變數(例如,mysql_result($result,0,"position"))應該以字串的形式顯示出來。 想更深入瞭解printf,請參閱PHP文檔。
如果文字是折行的,請確保每一個INSERT語句都是另起一行的。 現在,我們要把資料加入到mydb資料庫中了。 在命令列下,鍵入下面的命令:
mysql -u root mydb < mydb.dump
此時您應該不會遇到什麼錯誤。 如果真的出錯了,請仔細檢查一下是否因上面的文字折行而引起錯誤。 >>
這一課我們就講到這裡了。 我們已經成功地編譯、安裝和設置了MySQL和PHP,並且運行了一個簡單的程式來讀取資料庫中的資訊。