PHP功能的強大首先在于它的大量的內(nèi)置函數(shù)庫,它可以讓初學者也能執(zhí)行許多復雜的任務,而不必安裝新的庫和關心底層的詳細情況,而這恰恰是其它流行的諸如Perl這樣的客戶端語言所不具備的。由于這個教程的限制,我們僅僅學習了一些與MySQL數(shù)據(jù)庫相關的一些函數(shù)(事實上,即使是這種函數(shù),我們也沒有學全)。在這最后的部分,我們會稍微擴大一下范圍來看看其它對于建立一個數(shù)據(jù)庫驅動的網(wǎng)站有用的PHP的特征。 我們首先將學習PHP的include函數(shù),使用這個函數(shù),我們可以在許多頁面中重復使用同一個PHP代碼段。我們還看到如何利用這個函數(shù)提高我們的網(wǎng)站的安全性。 雖然PHP一般是相當快速和有效率的,但是它會加重服務器的運行時間和工作量。對于一個高流量的站點來說,這種負擔可能會達到無法接受的程度。但是這并不意味著我們需要放棄我們的站點的數(shù)據(jù)庫驅動的特征。我們會看到如何使用PHP在后臺建立半動態(tài)頁面而不必過分加重服務器的負擔。 經(jīng)常有人問論壇是如何利用一個<INPUT TYPE=FILE>標記來接受文件的上載的。我們也將學習到如何用PHP實現(xiàn)這種功能,而且我們還會看到如果將其有效地結合到一個數(shù)據(jù)庫驅動的站點中。 最后,PHP還有一個相當強大的功能是可以很簡單地將動態(tài)生成的內(nèi)容很方便地作為email的信息發(fā)送出去。不論你是想要使用PHP使得訪問者將你的站點的內(nèi)容發(fā)送給它們的朋友,還是僅僅想提供一種方法讓用戶可以得到他們遺忘的口令,PHP的email函數(shù)都可以很好地實現(xiàn)這種功能! PHP的服務器端包含 如果你已經(jīng)在Internet上工作過一段時間,你也許接觸過服務器端包含(SSI)這個術語;如果你沒有接觸過,你可以參看有關這個問題的Matt Mickiewicz的迷你指南。 從本質上說,SSI允許你將存儲在你的Web服務器上的某一個文件的內(nèi)容插入到另一個文件中去,最常見的應用是將一個網(wǎng)站的公用設計部分寫入一個小的HTML文件當中,這個文件可以被Web頁面所包含。對這個小文件的所有變動立即會影響所有包含它的文件。就象一個PHP腳本一樣,Web的瀏覽者不需要對此有所了解,因為Web服務器會在將被請求的頁面發(fā)送到瀏覽器之前做好所有的工作。 PHP有一個函數(shù)可以提供類似的功能。但是在包含文件中除了可以含有正式的HTML以及其它靜態(tài)的內(nèi)容以外,還可以含有腳本程序。讓我們來看看下面這個例子: <!-- 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文件中才會被執(zhí)行,此外這也有助于你分辨你的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函數(shù)的調用。我們指定了我們要插入的文件名(include-me.inc),PHP會試圖獲取這個文件并將其插入到現(xiàn)在的文件中以取代include。將這兩個文件都上載到你的Web服務器(或者將它們拷貝到你的Web服務器的文檔文件夾,如果你正在這個服務器上工作的話),然后用你的瀏覽器裝載testinclude.php。你會看到一個包含我們的插入文件信息的Web頁面的,一切和你當初預料的沒有什么兩樣。 如果這個例子不能工作,你也許需要配置你的php.ini文件中的include_path選項。用你常用的文本編輯器打開這個文件找到以include_path開始的一行(一般是在文件的中間)。就象你所熟悉的系統(tǒng)PATH環(huán)境變量的設置一樣,這里包含了一個目錄的列表,PHP會從這些位置尋找你所要包含的文件。它應該包括"."(當前目錄)。 根據(jù)你的服務器的操作系統(tǒng)是Windows還是UNIX,你也許需要確定是否要用到引號: 對于UNIX: include_path=.:/another/directory
對于Windows: include_path=".;c:anotherdirectory"
利用插入文件提高安全性 PHP腳本有時會包含一些諸如用戶名、口令以及其它一些你不想公開的敏感信息。你也許已經(jīng)使用過mysql_connect函數(shù),這個函數(shù)要求你在需要訪問數(shù)據(jù)庫的PHP腳本中輸入你的MySQL用戶名和口令。雖然你可以簡單地對MySQL進行設置以使得這個用戶名和口令只能供PHP使用,而為會被可能出現(xiàn)的黑客利用(通過在第八章中學習的方法對用戶表的主機字段進行設置),你也許還是需要其它的比較方便的對你的用戶名和口令的保護。 “但是等一下,”可能你會這樣說,“因為PHP是由服務器處理的,沒人會看到我的口令,對嗎?”不錯,但是你是否考慮到這樣一個情況,服務器對PHP的解析可能會因為偶然的原因而停止。這可能是因為某個善意的同事對軟件的錯誤配置,也可能是因為其它的因素,如果發(fā)生了這樣的情況,PHP頁面會當成純文本文件來處理,于是你的所有的PHP代碼(包括你的口令)將是完全公開的! 為了預防這樣的安全漏洞,你可以將包含敏感信息的代碼放到一個插入文件中,然后將它放到一個不屬于你的Web服務的目錄結構的目錄中去。將這個目錄添加到你的PHP的include_path中(在php.ini中添加),你可以指定PHP包含函數(shù)所使用的目錄,而不必擔心其中文件的安全,因為你的Web服務器不會將其作為Web頁來顯示。 例如,如果你的Web服務器定義所有的Web頁面必須存在于/home/httpd/及其子目錄中,你可以建立一個名為/home/phplib/來保存你的包含文件。將這個目錄添加到你的include_path中,這樣就行了!下面的例子顯示了如何將你的數(shù)據(jù)庫連接代碼放置到一個包含文件中: <!-- dbConnect.inc (in /home/phplib/) --> <?php $cnx = mysql_connect("localhost", "root", "rootpassword"); ?> 以及一個使用這個包含文件的文件: <!-- dbSample.php (in /home/httpd/) --> <?php // Connect to MySQL include("dbConnect.inc"); mysql_select_db("myDatabase",$cnx); ...
正如你看到的,如果你的服務器的PHP停止了工作,被暴露的僅僅是對包含函數(shù)的調用。用戶名和口令被安全地存儲在dbConnect.inc中,而這個文件不能從網(wǎng)站直接訪問。 半動態(tài)頁面 作為一個成功的(或者是即將成功的)網(wǎng)站的所有者,你肯定希望你的網(wǎng)站的訪問量越來越高。不幸的是,大的訪問量恰恰也是Web服務器的管理者所擔心的事--特別是當網(wǎng)站主要是由動態(tài)生成的、由數(shù)據(jù)庫驅動的頁面組成的時候,情況更是這樣。這樣的頁面與處理傳統(tǒng)的HTML文件相比,意味著運行Web服務軟件的計算機的巨大負擔。因為對每一個頁面的請求都相當于在計算機上運行一個小程序。 雖然數(shù)據(jù)庫驅動的站點的有些頁面必須嚴格地實時地從數(shù)據(jù)庫中調用相關的數(shù)據(jù),但是大部分頁面的要求并不這么嚴格。例如對于一個Web站點的首頁來說,典型的情況是,它會向訪問者簡要介紹這個站點最近做了哪些更新。但是事實上這樣的更新多長時間做一次呢?一天一次?還是一周一次?而且對于你的站點的訪問者來說非常及時地了解這些更新又有多大價值?也許對于這類變動在你網(wǎng)站上的反應稍微有點滯后也不會有多大問題。 通過將高訪問量的動態(tài)頁面轉換成“半動態(tài)”的頁面,也就是一個可以按照一定時間間隔“刷新”內(nèi)容以動態(tài)地重新生成的靜態(tài)頁面,你可以大大減輕你的Web服務器處理數(shù)據(jù)庫驅動的頁面的工作量。 例如,我們有一個名為index.php的首頁,它提供你的網(wǎng)站的新內(nèi)容的摘要。通過對服務器日志的檢查,你可以發(fā)現(xiàn)這是你的網(wǎng)站中被訪問得最多的頁面之一。通過前面的討論,你應該已經(jīng)意識到對于這個頁面我們并不需要在每次請求時動態(tài)地生成。只在在每次將新內(nèi)容添加到你的站點的同時更新這個頁面,就可以充分保證它的動態(tài)效果了。使用一個PHP程序,你可以生成動態(tài)輸出的頁面一個靜態(tài)的“映像”,你可以將其命名為index.html以取代原來的動態(tài)頁面。 我們需要學習一些有關文件讀取、寫入以及修改的知識。PHP可以很好地完成這些工作,只是我們之前沒看到過這些我們所需要的函數(shù): fopen 打開一個文件,以用來進行讀寫操作。這個文件可以存儲在服務器的硬盤上,也可以通過一個URL裝載。 fclose
通知PHP你將不再對某一文件進行讀寫操作,釋放它以備其它程序或腳本使用。 fread
將一個文件的數(shù)據(jù)讀入到一個PHP變量中。允許你指定讀取多少信息(也就是多少字符或多少字節(jié))。 fwrite
將一個來自于PHP變量的數(shù)據(jù)寫入到文件中。 copy
執(zhí)行一個文件拷貝的操作。 unlink
從硬盤中刪除一個文件。 你明白了嗎?如果還沒有,不要擔心--等一下我們會進行詳細講解。 建立一個名為generateindex.php的文件。它用來模擬一個Web瀏覽器從index.php(你的首頁的動態(tài)版本)讀取內(nèi)容,并將其以靜態(tài)文本的格式寫入index.html中。如果在這個處理過程中發(fā)生了什么錯誤,我們需要避免對原來的index.html“好的”拷貝的破壞,所以我們的這個腳本先將新的靜態(tài)版本寫入到一個臨時文件(tempindex.html)中,如果中途沒發(fā)生什么問題,再用其覆蓋index.html。 下面是generateindex.php的代碼,我們加入足夠多的注解以保證你能順利地讀懂這段程序: <!-- generateindex.php --> <?php //設置我們將要使用的文件 $srcurl = "http://localhost/index.php"; $tempfilename = "tempindex.html"; $targetfilename = "index.html"; ?> <HTML> <HEAD> <TITLE> Generating <?php echo("$targetfilename"); ?> </TITLE> </HEAD> <BODY> <P>Generating <?php echo("$targetfilename"); ?>...</P> <?php //首先刪除上次操作可能遺留下來的臨時文件。 //這個過程可能會提示錯誤,所以我們使用@以防止報錯。 @unlink($tempfilename); //通過一個URL的請求裝入動態(tài)版本。 //在我們接收到相關內(nèi)容之前,Web服務器會對PHP進行處理 //(因為本質上我們是在模擬一個Web瀏覽器), //所以我們將獲得的是一個靜態(tài)的HTML頁面。 //'r'指出我們只要求對這個“文件”進行讀操作。 $dynpage = fopen($srcurl, 'r'); //處理錯誤 if (!$dynpage) { echo("<P>Unable to load $srcurl. Static page ". "update aborted!</P>"); exit(); } //將這個URL的內(nèi)容讀入到一個PHP變量中。 //指定我們將讀取1MB的數(shù)據(jù)(超過這個數(shù)據(jù)量一般是意味著出錯了)。 $htmldata = fread($dynpage, 1024*1024); //當我們完成工作后,關閉到源“文件”的連接。 fclose($dynpage); //打開臨時文件(同時在這個過程中建立)以用來寫入(注意'w'的用法). $tempfile = fopen($tempfilename, 'w'); //處理錯誤 if (!$tempfile) { echo("<P>Unable to open temporary file ". "($tempfilename) for writing. Static page ". "update aborted!</P>"); exit(); } //將靜態(tài)頁面的數(shù)據(jù)寫入到臨時文件中 fwrite($tempfile, $htmldata); //完成寫入后,關閉臨時文件。 fclose($tempfile); //如果到了這里,我們應該已經(jīng)成功地寫好了一個臨時文件, //現(xiàn)在我們可以用它來覆蓋原來的靜態(tài)頁面了。 $ok = copy($tempfilename, $targetfilename); //最后刪除這個臨時文件。 unlink($tempfilename); ?> <P>Static page successfully updated!</P> </BODY> </HTML>
上面的代碼看上去很令人恐怖,其實這只是因為我們在其中包含了大量的注釋。刪除這些注釋。你會看到這段代碼其實很簡單。 現(xiàn)在,每當我們運行generateindex.php(也就是說通過一個瀏覽器請求這個頁面),就會從index.php生成一個新刷新的index.html。通過將index.php和generateindex.php移動到一個訪問有限制的目錄,你可以保證只有站點管理者能夠更新你的主頁。將這個腳本作一下擴充,你可以生成你的站點上的所有的半動態(tài)頁面,你還可以在你的內(nèi)容管理系統(tǒng)中增加“更新主頁”的連接! 如果你希望你的主頁能夠自動地刷新,你只需要設置你的服務器定期地運行generateindex.php(例如說,每隔一個小時)。在新的Windows 9x下,你可以使用任務管理程序(對于舊的版本,你必須使用補丁包)每隔一個小時自動運行php.exe。你只需要建立一個包含以下行的名為generateindex.bat的批處理文件。 C:PHPphp.exe C:WWWgenerateindex.php
如果必要的話,對路徑和文件名進行調整,然后設置任務管理程序每隔一個小時執(zhí)行一次generateindex.bat(你需要設置24個每天在固定時間運行的任務)。 在Linux下(或其它基于UNIX的平臺下)你可以使用cron--一個可以在各種UNIX系統(tǒng)下用來定義任務和運行時間的程序來完成類似的工作。如果你對cron還不了解的話,你可以請教你熟悉的Linux專家,或者查閱你熟悉的Linux網(wǎng)站。 你使用cron設置任務和我們之前討論的在Windows下的用法很類似。但是,你需要一個單機版的PHP,這不是指在第一章中編譯的Apache中可導入的PHP模塊。你需要對用來編譯Apache模塊的同一軟件包中單獨地進行編譯。如果你需要幫助,你可以參看軟件包提供的說明,也可以查閱PHP官方網(wǎng)站! 對于一個有經(jīng)驗的cron使用者來說,你只需要在你的crontab文件中增加下面的這一行: 0 0-23 * * * php /path/to/generateindex.php > /dev/null
處理文件的上載 到目前為止,這個教程中數(shù)據(jù)庫驅動的站點的所有例子都是處理的文本的數(shù)據(jù)。笑話、文章、作者...所有的這些都可以完全由文本形式的字符串來表示。但是如果你在運行時,有一個在線的數(shù)字圖庫需要人們能夠上載用數(shù)字照相機拍攝的圖片,我們就需要允許訪問者向我們的站點上載他們的圖片,我們也需要相應的處理程序。 讓我們先從基本的開始:寫一個HTML表單用來供用戶上載文件。在HTML中,這很簡單,只需要用一個<INPUT TYPE=FILE>標志就行了。但是,默認情況是只有用戶選擇的文件名被發(fā)送了。要通過表單數(shù)據(jù)提交文件自身,我們需要在<FORM>標志中增加ENCTYPE="multipart/form-data": <FORM ACTION="fileupload.php" METHOD=POST ENCTYPE="multipart/form-data"> <P>Select file to upload: <INPUT TYPE=FILE NAME="uploadedfile"></P> <P><INPUT TYPE=SUBMIT NAME="submit" VALUE="Submit"></P> </FORM>
正如我們看到的,一個PHP腳本(fileupload.php)會處理前面的表單提交的數(shù)據(jù)。也正如你所預計的,一個名為$uploadedfile(由<INPUT>標志的NAME屬性確定)的PHP變量會自動被建立。但是,$uploadedfile中存儲的不是上載文件的內(nèi)容,而是存儲在Web服務器上的硬盤中的文件的文件名,這個文件被保存在TEMP環(huán)境變量所指定的目錄中(例如,對于絕大多數(shù)的Windows 9x系統(tǒng),這個目錄將是C:WindowsTEMP)。這個文件僅僅在用來處理該表單提交的PHP腳本運行時存在,所以如果你想有什么其它用途(例如,將它存起來以供網(wǎng)站顯示),你需要使用我們在前面提到的copy函數(shù)在其它地方做一份拷貝。 伴隨著$uploadedfile,三個其它的變量也會同時被建立。$uploadedfile_name包含了文件提交前的文件名(已提交的文件將在TEMP目錄中以phpx的文件名存儲,這里x是一個數(shù)字),$uploadedfile_size說明了文件的大小(以字節(jié)表示),而$uploadedfile_type說明了MIME類型(例如text/plain、image/gif等等)。記住,"uploadedfile"僅僅是提交文件的INPUT標志中的NAME,實際的文件名將存在上述變量中。 你可以根據(jù)這些變量以決定是否接受一個上載的文件。例如,在我們的圖庫中我們僅僅只對JPEG或GIF文件感興趣。這些文件的MIME類型應該是image/pjpeg或image/gif,所以確認上載文件的代碼大致上是這樣大: if ("image/pjpeg" == $uploadedfile_type or "image/gif" == $uploadedfile_type) { // Handle the file... } else { echo("<P>Please submit a JPEG or GIF image file. "); }
雖然你可以使用一個類似的技術以拒絕過大的文件(通過檢查$uploadedfile_size變量),但是通常這不是一個好主意。在得到這個變量之前,這個文件已經(jīng)被上載并保存在TEMP目錄中。如果你試圖因為磁盤容量或者是帶寬的原因拒絕文件的上載,事實上那個大文件還是被上載了(盡管它們立即又被刪除了),這對于你來說也許是個問題。 更好的方法是,你可以提前告訴PHP你希望可以接受的文件的大小的上限。有兩個方法。第一個是調整你的php.ini文件中的upload_max_filesize設置。默認值是2MB,所以如果你想要接受更大的文件,你需要立即改變這個值。 第二個方法是在你的表單中包含一個隱含INPUT域,它的名字是MAX_FILE_SIZE,在其中你可以定義你所能接受的最大的文件的大小。出于安全的原因,這個值不能超過你的php.ini文件中的upload_max_filesize的設置,但是它提供了一種方法在不同頁面中各自定義上載文件大小的上限。例如,下面的表單,只允許我們最大上載1K字節(jié)的文件(1024字節(jié)): <FORM ACTION="fileupload.php" METHOD=POST ENCTYPE="multipart/form-data"> <P>Select file to upload: <INPUT TYPE=FILE NAME="uploadedfile"></P> <P><INPUT TYPE=SUBMIT NAME="submit" VALUE="Submit"></P> <INPUT TYPE=HIDDEN NAME=MAX_FILE_SIZE VALUE=1024> </FORM>
指定唯一的文件名 正如我們前面提到的,要保存一個上載的文件,我們需要將它拷貝到另一個目錄是保存。當我們從$uploadedfile_name獲取每個上載的文件的文件名時,我們不能保證不會上傳兩個同名的文件。在這種情況下,使用它的原名存儲文件將導致新上載的文件覆蓋原來上載的文件。 因為這個原因,你通過想要采用一種方法對所有上載的文件指定一個唯一的文件名。使用系統(tǒng)時間(它可以通過使用PHP的time函數(shù)獲得),我們可以容易地取得一個其于從1/1/1970到目前的秒數(shù)的名字。但是如果兩個文件恰巧在同一秒同時被上載呢?這了防止這個問題,我們在文件名中同時使用客戶端的IP地址(由PHP自動存儲在$REMOTE_HOST中)。因為我們不太可能同一秒從同一個IP地址接受兩個文件,這個方案應該是可行的。 // Pick a file extension if ( "image/pjpeg" == $uploadedfile_type ) $extension = ".jpg"; else $extension = ".gif"; // The complete path/filename $filename = "C:Uploads" . time() . $REMOTE_HOST . $extension; // Copy the file if (copy($uploadedfile, $filename)) { echo("<P>File stored successfully as $filename."); } else { echo("<P>Could not save file as $filename!"); }
請注意如果是在Windows下,我們必須在路徑中使用雙反斜杠(),因為反斜杠用來在PHP文本字符串中表示特殊字符。而在UNIX下,我們只要象通常那樣使用一個斜杠(/)。 將上載的文件保存到數(shù)據(jù)庫中 我們已經(jīng)建立了一個訪問者可以上傳JPEG和GIF圖象,并將其存儲在我們的服務器上的系統(tǒng),但是為什么不是這個教程所介紹的數(shù)據(jù)庫驅動呢?如果我們這個系統(tǒng)就這樣維持現(xiàn)狀不變,將不得不有人負責從文件夾中收集提交的圖象并手工將其添加到Web站點!回頭看看第七章,在那里我們開發(fā)了一個系統(tǒng)使得站點的訪問者可以提交笑話將將其存到數(shù)據(jù)庫中,以備管理者通過,我們知道這是一種更好的方法! MySQL有一些列類型可以用來存儲二進制數(shù)據(jù)。在數(shù)據(jù)庫術語中,這些列類型可以存儲BLOB(二進制大對象)。然而,在一個關系型數(shù)據(jù)庫中儲存大的文件并不是一個好主意。盡管將所有數(shù)據(jù)放在一個地方會給我們帶來方便,但是大的文件導致大的數(shù)據(jù)庫,而大的數(shù)據(jù)庫會導致性能的降低和太大的備份文件。 通常最好的選擇是將文件名存儲在數(shù)據(jù)庫中。只要你記得在數(shù)據(jù)中刪除記錄時刪除相應的文件就可以了。 PHP中的Email Email在Internet上有著強大的影響力。不論你是想要給你的用戶提供一個"what's new"周刊,還是考慮一個途徑讓你的用戶可以獲得丟失的口令,你都會用到email。PHP便得使用email非常的簡單,你只需要簡單地調用mail函數(shù)就可以發(fā)出信息。 在你使用mail函數(shù)發(fā)送email之前,你首先必須設置PHP的與email相關的選項。這兒是在Windows下的php.ini文件中的相關行: [mail function] SMTP = localhost ;僅對win32有效 sendmail_from = me@localhost.com ;僅對win32有效 ;sendmail_path = ;僅對unix有效 ...
取決于你使用的是Windows還是UNIX,PHP會通過一個SMTP服務器或一個本地的sendmail系統(tǒng)發(fā)送email。對這些的設置不是本教程的討論范圍,你可以從其它地方找到有關這二者的大量信息。然而,如果你是在Windows上運行,有可能你的ISP已經(jīng)為你提供了一個SMTP服務器。這也就是你發(fā)送信息設置你的email程序所用的服務器。將SMTP設置為那個服務器的主機名或IP地址。 sendmail_from會設置你的emails發(fā)出時默認的發(fā)出的email地址。如果你正在管理這個服務器,你可以將你的email地址放在這兒。 最后,sendmail_path在UNIX下將不會被注釋(也就是說,刪除這一行前面的分號),你需要將其設置為你的系統(tǒng)上的sendmail程序的路徑和文件名。在Linux下,這通常是指/usr/sbin/sendmail。 做好這些配置后重新啟動你的Web服務器,PHP將具有全部的email功能。現(xiàn)在在PHP中發(fā)送一個email是相當容易的: mail("to-address@somewhere.com", "Message Subject", "This is the body of the message.");
要發(fā)送給多個收件人只需要將多個地址用逗號分開: mail("to1@mail.net, to2@mail.net, ...", "Message Subject", "Message body");
在標題中指定From:或者Reply-To:的地址也非常簡單。將其作為第四個參數(shù)帶入,其中以回車-換行符分隔: mail("to@mail.net", "Message Subject", "Message body", "From: webmaster@host.com Reply-to:admin@host.com");
與一個數(shù)據(jù)庫相結合,一個郵件列表變得非常容易管理!只需要從數(shù)據(jù)庫中取出地址列表并使用mail函數(shù)發(fā)送信息就行了。個人化的信息也非常簡單。參看下面的例子: // Retrieve $email and $password from the database based // on the $username provided in a form. mail($email, "Your Password", "Hi there!
You just filled out a form on our Web site indicating that you had lost your password. As requested, we are sending it to you by email. username: $username password: $password Please record this information in a safe place so you have it on hand for your next visit to pingpongballs.com! -The Webmaster. ");
如果你在在UNIX下運行,而且你沒有一個本地的sendmail系統(tǒng)可以發(fā)送email,這也不要緊。PHP具有完善的TCP/IP網(wǎng)絡性能,如果需要,你可以連接到一個SMTP服務器以發(fā)送信息。同樣的,如果你需要在發(fā)出的信息中包含附件,PHP也可以實現(xiàn)這種功能。 不幸的是,內(nèi)置的mail函數(shù)不支持這些特征,如果你需要它們,你將不得不從頭編寫你自己的email函數(shù)。WROX Press編寫的"專業(yè)PHP程序設計"已經(jīng)為你完成了這些工作,在該書的第17章你可以找到全部的代碼。盡管這是我高度推薦的一本好書(見我的回顧),但是如果你只是想獲得這項功能,你也可以不購買這本書,這個源代碼你可以從WROX的網(wǎng)站自由地下載。 除了這兩個小問題外,PHP的內(nèi)置mail函數(shù)為你的Web頁面發(fā)送email信息提供了令人難以相信的方便。
|