PHP 手冊
前一頁 | 章 12. 各類變數 | 下一頁

# 來自 PHP 以外的變數

## HTML 表單 (GET 和POST)

當一份表單傳送給 PHP 程式時，表單內的資訊將自動提供給該程式。我們有很多方法存取這些資訊，範例：

範例 12-1. 一個簡單的 HTML 表單

    <form action="foo.php" method="post">
        Name:  <input type="text" name="username"><br>
        Email: <input type="text" name="email"><br>
        <input type="submit" name="submit" value="Submit me!">
    </form>

根據您的安裝方式和個人偏好，PHP 提供多種方式存取 HTML 表單中的資料。一些例子如：

範例 12-2. 存取一個以 POST 方式傳送的簡單 HTML 表單

    <?php
    // Available since PHP 4.1.0

       print $_POST['username'];
       print $_REQUEST['username'];

       import_request_variables('p', 'p_');
       print $p_username;

    // Available since PHP 3. As of PHP 5.0.0, these long predefined
    // variables can be disabled with the register_long_arrays directive.

       print $HTTP_POST_VARS['username'];

    // Available if the PHP directive register_globals = on.  As of
    // PHP 4.2.0 the default value of register_globals = off.
    // Using/relying on this method is not preferred.

       print $username;
    ?>

使用 GET 方式傳送的表單用法類似，只不過使用合適的先前定義的函數。GET 也可使用在查詢字串 (QUERY_STRING) 〈URL 中問號 '?' 後面的資訊〉。例如，http://www.example.com/test.php?id=3 含有以 $_GET['id'] 方式存取的 GET 資料。請參考 $_REQUEST 和 import_request_variables()()。

> 注: Superglobal 陳列如 $_POST 及 $_GET 在 PHP 版本 4.1.0 以上才開始提供。

上面提到，在 PHP 4.2.0 之前的版本中，register_globals 的預設值是 on。而在 PHP 3 中，它永遠是 on 的。我們建議所有使用者不要依賴此指令，並在編寫時將它當作是 off 來設計您的程式。

> 注: magic_quotes_gpc 組態指令會影響到 Get，Post 和 Cookie 的值。如果開啟此指令，(It's "PHP!") 的值將變成 (It\'s \"PHP!\")。此跳出工作在將字串插入資料庫前是必須要做的。請參考 addslashes()，stripslashes() 和 magic_quotes_sybase。

PHP 也懂得處理陳列式的表單變數〈請參觀相關的 FAQ〉。您可以將相關的變數歸類，或用此功能來取回多元選擇輸入表單的值。在下列範例中，我們將表單張貼到它自己，並在傳送後把資料顯示出來：

範例 12-3. 更複雜的表單變數

`<?php
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
print '<pre>';
print_r($_POST);
print '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';
print '</pre>';
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbr酳</option>
</select><br>
<input type="hidden" name="action" value="submitted">
<input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?>`

PHP 3 的陳列表單變數只可以使用一維陳列，而 PHP 4 則沒有此限制。

### IMAGE SUBMIT 變數名稱

在傳送表單時，我們可以使用下列標籤將標準的提交鍵以圖像來取代：

    <input type="image" src="image.gif" name="sub">

當使用者在圖像的任何一處按一下，伴隨的表單就會傳送到伺服器，隨其而來還附加了兩個變數，sub_x 和 sub_y。這包含了使用者按在圖像的座標。有經驗的使用者或許知道由瀏覽器傳送來的變數名稱應該包含句號，而不是底線，但 PHP 自動地將句號轉換成為底線。

## HTTP Cookies

PHP 絕對支援 Netscape規格的 HTTP cookies。Cookies 是用來將資料儲存在用戶端的瀏覽器中，以便日後追蹤或識別返回的使用者。您可以用 setcookie()() 函數來設定 cookies。Cookies 是 HTTP header 的一部份，因此 SetCookie 函數一定要在任何資料傳送去瀏覽器前呼叫。這和 header()() 函數有著相同的限定。Cookie 資料可以在 $_COOKIE，$HTTP_COOKIE_VARS 及 $_REQUEST 陳列中供使用。詳情和範例請參考手冊的 setcookie()() 部份。

若您要將多個值指派給一個 cookie 變數，那您就要使用陳列來指派了。範例：

`<?php setcookie("MyCookie[foo]", "Testing 1", time()+3600); setcookie("MyCookie[bar]", "Testing 2", time()+3600); ?>`

這將會建立兩個個別的 cookies，儘管現在 MyCookie在您的程式中是一個單元陳列。如果您要以一個 cookie 建立多個值，那您可先對那些值使用 serialize()() 或 explode()() 函數。

有一點必須留意的是，一個 cookie 將會替代瀏覽器中另一個同名的 cookie，除非該 cookie 的路徑或網域名稱不同。所以，在設計購物車程式時，您最好保持一個計數器，並將此數據傳遞下去，即：

範例 12-4. 一個 setcookie()() 的範例

`<?php $count++; setcookie("count", $count, time()+3600); setcookie("Cart[$count]", $item, time()+3600); ?>`

## 在變數名字中的句號 (dots)

一般上，PHP 並不會更改傳入程式的變數名稱。然而，您必須留意句號 (.) 並不是一個有效的 PHP 變數名稱字元，正如：

`<?php $varname.ext; /* invalid variable name */ ?>`

這時，剖析器見到的只是一個叫做 $varname 的變數，跟隨著字串連結運算子 (.)，再來是一個無引號的字串：ext。顯然地，這並不會帶來您想要的結果。

正因如此，PHP 會自動的將傳入的變數名稱中的句號 (.) 改為底線 (_)。

## 判定變數的類型

由於 PHP 會自行判斷變數的類型，並按需要轉變它們的類型，因此有時也難以明顯地判定一個變數在某個時刻的類型。有鑑於此，PHP 提供了幾個判定變數類型的函數：gettype()()、is_array()()、is_float()()、is_int()()、is_object()() 及 is_string()()。請參閱類型一章。

前一頁 | 內容 | 下一頁
可變變數 | 上一層 | Constants