據Merriam-Webster Online地解釋,動態一詞的意思是網頁的內容由“通常是連續的和實時生成的活動或者改變的信息組成。”因此當我們談論動態數據的時候,我們也就是在談論作為Web頁面發送給用戶的信息是由不同的源數據組合而成的。這與靜態網頁的概念是相對的,靜態網頁的內容並不依賴用戶輸入的數據而改變而且通常是直接解析給用戶。Web頁面上的動態信息有三種主要的類型:
動態數據–在一個Web頁面裡產生的變量。
動態Web頁面–整個Web頁面都是動態生成的。
動態內容–Web頁面的一部分是動態生成的。
你如果希望對動態內容產生的過程進行細微的控制,就象動態數據的那種類型一樣,那麼數據處理的過程就會復雜一些。而如果你想生成大范圍的信息,就象動態Web頁面的生成那樣,那麼程序的邏輯就會變得復雜。動態內容的生成是這兩種方式的折衷,它能夠讓我們使用兩個很有用的PHP函數,include()和require()。
要記住,你在後端加入的邏輯越多,那麼你的Web站點的性能將會損失得越嚴重。幸運的是,PHP能夠很流暢的進行預處理過程,所以當我在處理動態內容和數據的時候都盡可能多的使用PHP的功能。
數據源和PHP功能
所有的動態內容都有一個共同點:它們從一個原始頁面以外的數據源而來。圖A列出瞭一些常見的數據源以及用來處理它們的相應的PHP函數。
Figure A
數據源
PHP 函數
註釋
User
$HTTP_POST_VARS
$HTTP_GET_VARS
這些函數處理由用戶通過Web表單直接輸入的數據。
Database (local or remote)
<dbtype>_connect()
<dbtype>_pconnect()
<dbtype>_close()
<dbtype>_<function>()
example:
mysql_fetch_array()
這些都隻是PHP許多數據庫訪問函數中的一部分,許多函數是為每個不同的數據庫特別編寫的。你能夠在PHP函數參考手冊裡找到這些函數的完整列表。
Remote file
fopen(), fclose()
fgets(), fputs()
這些函數處理一個遠程服務器上文件中的數據,這個文件可以通過FTP訪問。
Local file
include(), require()
fopen(), fclose()
這些函數處理位於本地服務器上的文件中的數據,比方說配置文件。
常見的數據源和處理它們的PHP函數
在這篇文章“教程:PHP起步中,”我們觀看瞭一個演示的腳本,這個腳本要求用戶輸入他們最喜歡的數字。根據用戶輸入的結果,我們在Web頁面上顯示一條消息。這就是一個由用戶驅動的動態Web內容的例子。從Web表單返回的結果將決定顯示的內容。一個更復雜的例子是“點擊流程”應用程序,這個程序能夠根據一個用戶在Web站點上訪問過的頁面來決定向他或者她發送什麼廣告。
一旦數據已經輸入,不管它是由用戶或者其它的方式輸入的,將會被保存在一個數據庫中並在以後重新使用。如果它被用來決定顯示的內容,那麼這些內容將可以被認為是“由數據庫驅動的動態內容。”我們將在下一篇文章中更仔細的看看這種類型的動態信息。 目前,讓我們先察看一個由文件驅動的動態內容的簡單的PHP腳本的例子。我們將使用基於一個配置文件的邏輯來決定在Web頁面上應該顯示什麼樣的頁面風格和字體。我們選擇的頁面風格將會在用戶請求Web頁面的時候顯示出來。(這裡我想就包括文件的例子給你提個醒:你真的應該在這個例子中為完成要求的功能而使用風格頁。)
例子程序:Display.php
Display腳本使用一個獨立的配置文件來包含變量值和幾個含有HTML的變量部分的包括文件。雖然這看起來不是特別動態,但是你能夠輕易的要求用戶使用Web表單來創建一個配置文件並使用一定的邏輯來判斷應該加載哪一個配置文件,等等。(我們在“理解PHP的函數和類”這篇文章中所作的討論將幫助你完成這個工作。)
由於本文的目的所限,我們將跳過這方面的處理過程並盡量使它簡化。表A展示瞭我們的主頁面,以及你通過瀏覽器調用的頁面,Display.php。(PHP代碼將用粗體進行顯示。)
表A
這段簡單的代碼必須做三件事情:
使用PHP include()函數來包含<!– display.php 這個Web頁面的風格由一個配置文件決定 –>
<html>
<head>
<title>Mood Page</title>
</head>
<?php
include(“displayconf.php”);
$required_file = $display.”.php”;
require $required_file;
?>
<br><br>
<center>This is the best “mood page” ever!</center>
</font>
</body>
</html>
Displayconf.php中的變量並對它們進行求值。
創建一個表示用戶請求的文件名的變量。在我們這個例子中,Displayconf.php文件裡定義的變量$display被求值,然後加上.php後綴。(這是由我們的邏輯完成的。)
使用PHP的require()函數顯示正確的包含文件裡的內容。
你應該註意到在我們的例子中,PHP require()函數和include()函數是完全可以互換的。這兩個函數之間主要的區別在於目標文件處理的方式不同。一個require()語句將會由它所調用的文件替換。這意味著在一個循環當中,遠程的文件隻會被調用一次。而另一方面,在每次遇到include()函數的時候,它都會被重新求值。這意味著在一個循環的過程中,文件將在每一次循環過程中都被訪問一次,而且在包括文件中設置的變量每次都會更新。
在這個例子中,我試圖講清楚什麼時候使用什麼函數合適。對於文件Displayconf.php,很有可能它裡面的變量值已經改變。畢竟,這是一個配置文件。因此,我選擇瞭include()函數。而另一方面,$required文件在交互的過程中很有可能不會改變。如果用戶請求的是不同的文件體,那麼我們有可能會創建一個新的文件再把它包括進來,所以我使用require()函數。
高級用戶可能希望看看PHP的手冊來瞭解更多的關於函數require_once() 和 include_once() 的信息以便能夠對文件處理和配置文件變量的管理進行更好的控制。
表B 顯示瞭我們的配置文件,Displayconf.php。(為瞭簡單化的目的,我們將把所有的文件放在和Web服務器相同的目錄下。)我們在這裡要做的就是將$display變量設置成一個可選的值。
表B
<?php# displayconf.php
# display.php 的配置文件
# ————————————————-
# 將變量 $display 設置成下列值之一:
# happy, sad, 或者 generic
$display = “happy”;
?>
最後我們需要一些內容文件–對應配置文件中的每一個選項。因為這些內容都是靜態的HTML,所以我們不需要在文件裡加上PHP腳標。當你在PHP裡使用include()或者require()函數的時候,被調用的文件在處理過程開始的時候被跳過然後在處理結束的時候被加進來。
“happy”文件內容(happy.php)
<body bgcolor=pink text=yellow>
<font size=”+5″>
“Sad” 文件內容 (sad.php)
<body bgcolor=blue text=white>
<font face=”arial, helvetica” size=”+5″>
“Generic” 文件內容 (generic.php)
<body bgcolor=white text=black>
<font face=”courier” size=”+5″>
當你單擊頁面Display.php的時候,這個頁面的外觀和感受將會根據你在配置文件中輸入的值而改變。
總結
在本文中,我們討論瞭動態信息的基礎知識並使用一個腳本來創建由文件驅動的動態內容。特別的是,我們使用include() 和 require() PHP函數來提取和發送我們的數據。
下面是一些最後的話。雖然我相信你一定熟悉WAI Web編程指南,但是你也許還應該看看W3C對於動態內容所說的支配以及用戶對它的訪問能力。你可能還要看看PHP手冊中的這一章“使用遠程文件”來學習如何使用FTP來提取配置數據。