當一份表單傳送給 PHP 程式時,表單內的資訊將自動提供給該程式。我們有很多方法存取這些資訊,範例:
示範 7-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 表單中的資料。一些例子如:
示範 7-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()()。
上面提到,在 PHP 4.2.0 之前的版本中,register_globals 的預設值是 on。而在 PHP 3 中,它永遠是 on 的。我們建議所有使用者不要依賴此指令,並在編寫時將它當作是 off 來設計您的程式。
PHP 也懂得處理陳列式的表單變數〈請參觀相關的 FAQ〉。您可以將相關的變數歸類,或用此功能來取回多元選擇輸入表單的值。在下列範例中,我們將表單張貼到它自己,並在傳送後把資料顯示出來:
示範 7-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 則沒有此限制。
在傳送表單時,我們可以使用下列標籤將標準的提交鍵以圖像來取代:
當使用者在圖像的任何一處按一下,伴隨的表單就會傳送到伺服器,隨其而來還附加了兩個變數,sub_x 和 sub_y。這包含了使用者按在圖像的座標。有經驗的使用者或許知道由瀏覽器傳送來的變數名稱應該包含句號,而不是底線,但 PHP 自動地將句號轉換成為底線。
PHP 絕對支援 Netscape規格的 HTTP cookies。Cookies 是用來將資料儲存在用戶端的瀏覽器中,以便日後追蹤或識別返回的使用者。您可以用 setcookie()() 函數來設定 cookies。Cookies 是 HTTP header 的一部份,因此 SetCookie 函數一定要在任何資料傳送去瀏覽器前呼叫。這和 header()() 函數有著相同的限定。Cookie 資料可以在 $_COOKIE,$HTTP_COOKIE_VARS 及 $_REQUEST 陳列中供使用。詳情和範例請參考手冊的 setcookie()() 部份。
若您要將多個值指派給一個 cookie 變數,那您就要使用陳列來指派了。範例:
這將會建立兩個個別的 cookies,儘管現在 MyCookie在您的程式中是一個單元陳列。如果您要以一個 cookie 建立多個值,那您可先對那些值使用 serialize()() 或 explode()() 函數。
有一點必須留意的是,一個 cookie 將會替代瀏覽器中另一個同名的 cookie,除非該 cookie 的路徑或網域名稱不同。所以,在設計購物車程式時,您最好保持一個計數器,並將此數據傳遞下去,即:
示範 7-4.一個 setcookie()() 的範例
<?php $count++; setcookie("count", $count, time()+3600); setcookie("Cart[$count]", $item, time()+3600); ?>
|
|
一般上,PHP 並不會更改傳入程式的變數名稱。然而,您必須留意句號 (.) 並不是一個有效的 PHP 變數名稱字元,正如:
<?php $varname.ext; /* invalid variable name */ ?>
|
這時,剖析器見到的只是一個叫做
$varname 的變數,跟隨著字串連結運算子 (.),再來是一個無引號的字串:ext。顯然地,這並不會帶來您想要的結果。
正因如此,PHP 會自動的將傳入的變數名稱中的句號 (.) 改為底線 (_)。
由於 PHP 會自行判斷變數的類型,並按需要轉變它們的類型,因此有時也難以明顯地判定一個變數在某個時刻的類型。有鑑於此,PHP 提供了幾個判定變數類型的函數:gettype()()、is_array()()、is_float()()、is_int()()、is_object()() 及 is_string()()。請參閱類型一章。