PHP功能的強大首先在於它的大量的內置函數庫,它可以讓初學者也能執行許多復雜的任務,而不必安裝新的庫和關心底層的具體情況,而這恰恰是其它流行的諸如Perl這樣的客戶端語言所不具備的。由於這個教程的限制,我們僅僅學習了一些與MySQL數據庫相關的一些函數(事實上,即使是這種函數,我們也沒有學全)。在這最後的部分,我們會稍微擴大一下范圍來看看其它對於建立一個數據庫驅動的網站有用的PHP的特征。
我們首先將學習PHP的include函數,使用這個函數,我們可以在許多頁面中重復使用同一個PHP代碼段。我們還看到如何利用這個函數提高我們的網站的安全性。
雖然PHP一般是相當快速和有效率的,但是它會加重服務器的運行時間和工作量。對於一個高流量的站點來說,這種負擔可能會達到無法接受的程度。但是這並不意味著我們需要放棄我們的站點的數據庫驅動的特征。我們會看到如何使用PHP在後台建立半動態頁面而不必過分加重服務器的負擔。
經常有人問論壇是如何利用一個<INPUT TYPE=FILE>標記來接受文件的上載的。我們也將學習到如何用PHP實現這種功能,而且我們還會看到假如將其有效地結合到一個數據庫驅動的站點中。
最後,PHP還有一個相當強大的功能是可以很簡單地將動態生成的內容很方便地作為email的信息發送出去。不論你是想要使用PHP使得訪問者將你的站點的內容發送給它們的朋友,還是僅僅想提供一種方法讓用戶可以得到他們遺忘的口令,PHP的email函數都可以很好地實現這種功能!
PHP的服務器端包含
假如你已經在Internet上工作過一段時間,你也許接觸過服務器端包含(SSI)這個術語;假如你沒有接觸過,你可以參看有關這個問題的Matt Mickiewicz的迷你指南。
從本質上說,SSI答應你將存儲在你的Web服務器上的某一個文件的內容插入到另一個文件中去,最常見的應用是將一個網站的公用設計部分寫入一個小的HTML文件當中,這個文件可以被Web頁面所包含。對這個小文件的所有變動立即會影響所有包含它的文件。就象一個PHP腳本一樣,Web的浏覽者不需要對此有所了解,因為Web服務器會在將被請求的頁面發送到浏覽器之前做好所有的工作。
PHP有一個函數可以提供類似的功能。但是在包含文件中除了可以含有正式的HTML以及其它靜態的內容以外,還可以含有腳本程序。讓我們來看看下面這個例子:
<!-- include-me.inc --><br>
<?php<br>
echo( "<P>Soylent Green is made from people! ");<br>
?><br>
在上面的文件中,include-me.inc包含了一些簡單的PHP代碼。請注重這個文件的文件名的結尾是.inc,而不是.php。這表示這個文件與一般的Web服務器所認為的PHP腳本有所不同。這會保證這個文件只有被插入到一個.php文件中才會被執行,此外這也有助於你分辨你的PHP Web頁面和PHP包含文件。
你還需要下面的文件:
<!-- testinclude.php -->
<HTML>
<HEAD>
<TITLE> Test of PHP Includes </TITLE>
</HEAD>
<BODY>
<?php
include("include-me.inc");
?>
</BODY>
</HTML>
這個文件和我們以前使用過的PHP腳本差不多,它的擴展名是.php extension(假如你的服務器需要,也可以是.php3)。請注重對include函數的調用。我們指定了我們要插入的文件名(include-me.inc),PHP會試圖獲取這個文件並將其插入到現在的文件中以取代include。將這兩個文件都上載到你的Web服務器(或者將它們拷貝到你的Web服務器的文檔文件夾,假如你正在這個服務器上工作的話),然後用你的浏覽器裝載testinclude.php。你會看到一個包含我們的插入文件信息的Web頁面的,一切和你當初預料的沒有什麼兩樣。
假如這個例子不能工作,你也許需要配置你的php.ini文件中的include_path選項。用你常用的文本編輯器打開這個文件找到以include_path開始的一行(一般是在文件的中間)。就象你所熟悉的系統PATH環境變量的設置一樣,這裡包含了一個目錄的列表,PHP會從這些位置尋找你所要包含的文件。它應該包括"."(當前目錄)。
根據你的服務器的操作系統是Windows還是UNIX,你也許需要確定是否要用到引號:
對於UNIX:
include_path=.:/another/directory
對於Windows:
include_path=".;c:anotherdirectory"
利用插入文件提高安全性
PHP腳本有時會包含一些諸如用戶名、口令以及其它一些你不想公開的敏感信息。你也許已經使用過mysql_connect函數,這個函數要求你在需要訪問數據庫的PHP腳本中輸入你的MySQL用戶名和口令。雖然你可以簡單地對MySQL進行設置以使得這個用戶名和口令只能供PHP使用,而為會被可能出現的黑客利用(通過在第八章中學習的方法對用戶表的主機字段進行設置),你也許還是需要其它的比較方便的對你的用戶名和口令的保護。
“但是等一下,”可能你會這樣說,“因為PHP是由服務器處理的,沒人會看到我的口令,對嗎?”不錯,但是你是否考慮到這樣一個情況,服務器對PHP的解析可能會因為偶然的原因而停止。這可能是因為某個善意的同事對軟件的錯誤配置,也可能是因為其它的因素,假如發生了這樣的情況,PHP頁面會當成純文本文件來處理,於是你的所有的PHP代碼(包括你的口令)將是完全公開的!
為了預防這樣的安全漏洞,你可以將包含敏感信息的代碼放到一個插入文件中,然後將它放到一個不屬於你的Web服務的目錄結構的目錄中去。將這個目錄添加到你的PHP的include_path中(在php.ini中添加),你可以指定PHP包含函數所使用的目錄,而不必擔心其中文件的安全,因為你的Web服務器不會將其作為Web頁來顯示。
例如,假如你的Web服務器定義所有的Web頁面必須存在於/home/httpd/及其子目錄中,你可以建立一個名為/home/phplib/來保存你的包含文件。將這個目錄添加到你的include_path中,這樣就行了!下面的例子顯示了如何將你的數據庫連接代碼放置到一個包含文件中:
<!-- dbConnect.inc (in /home/phplib/) -->