Forum und email

來自 PHP 以外的變數

HTML 表單 (GET 和POST)

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

Example#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 表單中的資料。一些例子如:

Example#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 中問號 '?' 後面的資訊〉。例如,https://www.example.com/test.php?id=3 含有以 $_GET['id'] 方式存取的 GET 資料。請參考 $_REQUESTimport_request_variables()()

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

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

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

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

Example#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 的路徑或網域名稱不同。所以,在設計購物車程式時,您最好保持一個計數器,並將此數據傳遞下去,即:

Example#4 一個 setcookie()() 的範例

<?php
$count
++;
setcookie("count"$counttime()+3600);
setcookie("Cart[$count]"$itemtime()+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()()。請參閱類型一章。