當一個(gè)表單提交給 PHP 腳本時(shí),表單中的信息會(huì )自動(dòng)在腳本中可用。有幾個(gè)方法訪(fǎng)問(wèn)此信息,例如:
示例 #1 一個(gè)簡(jiǎn)單的 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>
只有兩種方法可以訪(fǎng)問(wèn) HTML 表單中的數據。 以下列出了當前有效的方法:
示例 #2 從一個(gè)簡(jiǎn)單的 POST HTML 表單訪(fǎng)問(wèn)數據
<?php
echo $_POST['username'];
echo $_REQUEST['username'];
?>
使用 GET 表單也類(lèi)似,只不過(guò)要用適當的 GET 預定義變量。GET
也適用于
QUERY_STRING
(URL
中在“?”之后的信息)。因此,舉例說(shuō),http://www.example.com/test.php?id=3
包含有可用 $_GET['id']
來(lái)訪(fǎng)問(wèn)的 GET 數據。參見(jiàn)
$_REQUEST。
注意:
變量名中的點(diǎn)和空格被轉換成下劃線(xiàn)。例如
<input name="a.b" />
變成了$_REQUEST["a_b"]
。
PHP 也懂得表單變量上下文中的數組(參見(jiàn)相關(guān)常見(jiàn)問(wèn)題)。例如可以將相關(guān)的變量編成組,或者用此特性從多選輸入框中取得值。例如,將一個(gè)表單 POST 給自己并在提交時(shí)顯示數據:
示例 #3 更復雜的表單變量
<?php
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
echo '<pre>';
print_r($_POST);
echo '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';
echo '</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
}
?>
注意: If an external variable name begins with a valid array syntax, trailing characters are silently ignored. For example,
<input name="foo[bar]baz">
becomes$_REQUEST['foo']['bar']
.
當提交表單時(shí),可以用一幅圖像代替標準的提交按鈕,用類(lèi)似這樣的標記:
<input type="image" src="image.gif" name="sub" />
當用戶(hù)點(diǎn)擊到圖像中的某處時(shí),相應的表單會(huì )被傳送到服務(wù)器,并加上兩個(gè)變量 sub_x 和 sub_y。它們包含了用戶(hù)點(diǎn)擊圖像的坐標。有經(jīng)驗的用戶(hù)可能會(huì )注意到被瀏覽器發(fā)送的實(shí)際變量名包含的是一個(gè)點(diǎn)而不是下劃線(xiàn)(即 sub.x 和 sub.y),但 PHP 自動(dòng)將點(diǎn)轉換成了下劃線(xiàn)。
PHP 透明地支持 ? RFC 6265定義中的 HTTP cookies。Cookies 是一種在遠端瀏覽器端存儲數據并能追蹤或識別再次訪(fǎng)問(wèn)的用戶(hù)的機制??梢杂? setcookie() 函數設定 cookies。Cookies 是 HTTP 信息頭中的一部分,因此 SetCookie 函數必須在向瀏覽器發(fā)送任何輸出之前調用。對于 header() 函數也有同樣的限制。Cookie 數據會(huì )在相應的 cookie 數據數組中可用,例如 $_COOKIE 和 $_REQUEST。更多細節和例子見(jiàn) setcookie() 手冊頁(yè)面。
注意: As of PHP 7.2.34, 7.3.23 and 7.4.11, respectively, the names of incoming cookies are no longer url-decoded for security reasons.
如果要將多個(gè)值賦給一個(gè) cookie 變量,必須將其賦成數組。例如:
<?php
setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>
這將會(huì )建立兩個(gè)單獨的 cookie,盡管 MyCookie 在腳本中是一個(gè)單一的數組。如果想在僅僅一個(gè) cookie 中設定多個(gè)值,考慮先在值上使用 serialize() 或 explode()。
注意在瀏覽器中一個(gè) cookie 會(huì )替換掉上一個(gè)同名的 cookie,除非路徑或者域不同。因此對于購物車(chē)程序可以保留一個(gè)計數器并一起傳遞,例如:
示例 #4 一個(gè) setcookie() 的示例
<?php
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>
通常,PHP 不會(huì )改變傳遞給腳本中的變量名。然而應該注意到點(diǎn)(句號)不是 PHP 變量名中的合法字符。至于原因,看看:
<?php
$varname.ext; /* 非法變量名 */
?>
出于此原因,要注意 PHP 將會(huì )自動(dòng)將變量名中的點(diǎn)替換成下劃線(xiàn)。
因為 PHP 會(huì )判斷變量類(lèi)型并在需要時(shí)進(jìn)行轉換(通常情況下),因此在某一時(shí)刻給定的變量是何種類(lèi)型并不明顯。PHP 包括幾個(gè)函數可以判斷變量的類(lèi)型,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。參見(jiàn)類(lèi)型一章。
HTTP being a text protocol, most, if not all, content that comes in Superglobal arrays, like $_POST and $_GET will remain as strings. PHP will not try to convert values to a specific type. In the example below, $_GET["var1"] will contain the string "null" and $_GET["var2"], the string "123".
/index.php?var1=null&var2=123
版本 | 說(shuō)明 |
---|---|
7.2.34, 7.3.23, 7.4.11 | The names of incoming cookies are no longer url-decoded for security reasons. |