實用的腳本

現在來編寫一些更實用的腳本,比如檢查瀏覽頁面的訪問者在用什麼瀏覽器。要達到這個目的,需要檢查會員的 agent 字串,它是瀏覽器傳送的 HTTP 請求的一部分。該訊息被存儲在一個變量中。在 PHP 中,變量總是以一個美元符開頭。我們現在感興趣的變量是 $_SERVER['HTTP_USER_AGENT']

注: $_SERVER 是一個特殊的 PHP 保留變量,它包括了 web 伺服器提供的所有訊息,被稱為自動全局變量(或「超全局變量」)。請查閱本手冊「超全局變量」中的有關內容以取得更多訊息。這些特殊的變量是在 PHP 4.1.0 版本引入的。在這之前使用 $HTTP_*_VARS 陣列,如 $HTTP_SERVER_VARS。儘管現在已經不用了,但它們在新版本中仍然存在(參見「舊代碼」一節中的註解)。

要顯示該變量,只需簡單地進行如下動作:

例子 2-3. 列印一個變量(陣列元素)

<?php echo $_SERVER['HTTP_USER_AGENT']; ?>

該腳本的輸出可能是:

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

PHP 有很多種不同類型的變量。在以上例子中我們列印了一個陣列的單元。陣列是一類非常有用的變量。

$_SERVER 只是 PHP 自動全局化的變量之一。可以查閱「保留變量」一節來檢視這些變量的清單,或是也可以通過上節例子中 phpinfo() 函數的輸出來檢視。

可以在一個 PHP 標識中加入多個 PHP 語句,也可以建立一個代碼塊來做比簡單的 echo 更多的事情。例如,若果需要識別 Internet Explorer,可以進行如下動作:

例子 2-4. 流程控制函數的使用

<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
    echo 
'正在使用 Internet Explorer。<br />';
}
?>

該腳本的輸出可能是:

正在使用 Internet Explorer。<br />

這裡要介紹一些新的原理。上面用了一個 if 語句。若果會員對 C 語系的基本語法比較熟悉,則應該對此很熟悉,否則,可能需要拿起任何一本 PHP 介紹性的書籍並閱讀前面的兩三個章節,或是也可以閱讀本手冊的「語系參考」一章。可以在 http://www.php.net/books.php 找到有關 PHP 的書籍的清單。

需要介紹的第二個原理,是對 strpos() 函數的呼叫。strpos() 是 PHP 的一個內建函數,其功能是在一個字串中搜尋另外一個字串。例如我們現在需要在 $_SERVER['HTTP_USER_AGENT'](即所謂的 haystack)變量中尋找 'MSIE'。若果在這個 haystack 中該字串(即所謂的 needle)被找到,則函數返回 needle 在 haystack 中相對開頭的位置;若果沒有,則返回 FALSE。若果該函數沒有返回 FALSE,則 if 會將條件判斷為 TRUE 並運行其花括號 {} 內的代碼;否則,則不運行這些代碼。可以自己嘗試利用 ifelse 以及其它的函數,例如 strtoupper()strlen(),來建立類似的腳本。在本手冊中關聯的頁面也包括有範例。若果對如何使用函數不是很確定,可以閱讀手冊中有關「如何閱讀函數定義」和「函數」的有關章節。

以下我們進一步顯示如何進出 PHP 模式,甚至是在一個 PHP 代碼塊的中間:

例子 2-5. 混和 HTML 和 PHP 模式

<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() 肯定沒有返回假 (FALSE)</h3>
<p>正在使用 Internet Explorer</p>
<?php
} else {
?>
<h3>strpos() 肯定返回假 (FALSE)</h3>
<center><b>沒有使用 Internet Explorer</b></center>
<?php
}
?>

該腳本的輸出可能是:

<h3>strpos() 肯定沒有返回假 (FALSE)</h3>
<p>正在使用 Internet Explorer</p>

和以上我們用一個 PHP 的 echo 語句來輸出不同的是,我們跳出了 PHP 模式來直接寫 HTML 代碼。這裡很值得注意的一點是,對於這兩種情況而言,腳本的邏輯效率是相同的。在判斷了 strpos() 函數的返回值是 TRUE 或是 FALSE,也就是判斷了字串 'MSIE' 是否被找到之後,最終只有一個 HTML 塊被傳送給瀏覽者。