來自 PHP 之外的變量

HTML 表單(GET 和 POST)

當(dāng)一個(gè)表單提交給 PHP 腳本時(shí),表單中的信息會(huì)自動(dòng)在腳本中可用。有幾個(gè)方法訪問此信息,例如:

示例 #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>

只有兩種方法可以訪問 HTML 表單中的數(shù)據(jù)。 以下列出了當(dāng)前有效的方法:

示例 #2 從一個(gè)簡(jiǎn)單的 POST HTML 表單訪問數(shù)據(jù)

<?php
        
echo $_POST['username'];
        echo 
$_REQUEST['username'];
        
?>

使用 GET 表單也類似,只不過要用適當(dāng)?shù)?GET 預(yù)定義變量。GET 也適用于 QUERY_STRING(URL 中在“?”之后的信息)。因此,舉例說,http://www.example.com/test.php?id=3 包含有可用 $_GET['id'] 來訪問的 GET 數(shù)據(jù)。參見 $_REQUEST

注意:

變量名中的點(diǎn)和空格被轉(zhuǎn)換成下劃線。例如 <input name="a.b" /> 變成了 $_REQUEST["a_b"]

PHP 也懂得表單變量上下文中的數(shù)組(參見相關(guān)常見問題)。例如可以將相關(guān)的變量編成組,或者用此特性從多選輸入框中取得值。例如,將一個(gè)表單 POST 給自己并在提交時(shí)顯示數(shù)據(jù):

示例 #3 更復(fù)雜的表單變量

<?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'].

IMAGE SUBMIT 變量名

當(dāng)提交表單時(shí),可以用一幅圖像代替標(biāo)準(zhǔn)的提交按鈕,用類似這樣的標(biāo)記:

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

當(dāng)用戶點(diǎn)擊到圖像中的某處時(shí),相應(yīng)的表單會(huì)被傳送到服務(wù)器,并加上兩個(gè)變量 sub_xsub_y。它們包含了用戶點(diǎn)擊圖像的坐標(biāo)。有經(jīng)驗(yàn)的用戶可能會(huì)注意到被瀏覽器發(fā)送的實(shí)際變量名包含的是一個(gè)點(diǎn)而不是下劃線(即 sub.x 和 sub.y),但 PHP 自動(dòng)將點(diǎn)轉(zhuǎn)換成了下劃線。

HTTP Cookies

PHP 透明地支持 ? RFC 6265定義中的 HTTP cookies。Cookies 是一種在遠(yuǎn)端瀏覽器端存儲(chǔ)數(shù)據(jù)并能追蹤或識(shí)別再次訪問的用戶的機(jī)制??梢杂? setcookie() 函數(shù)設(shè)定 cookies。Cookies 是 HTTP 信息頭中的一部分,因此 SetCookie 函數(shù)必須在向?yàn)g覽器發(fā)送任何輸出之前調(diào)用。對(duì)于 header() 函數(shù)也有同樣的限制。Cookie 數(shù)據(jù)會(huì)在相應(yīng)的 cookie 數(shù)據(jù)數(shù)組中可用,例如 $_COOKIE$_REQUEST。更多細(xì)節(jié)和例子見 setcookie() 手冊(cè)頁面。

注意: 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 變量,必須將其賦成數(shù)組。例如:

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

這將會(huì)建立兩個(gè)單獨(dú)的 cookie,盡管 MyCookie 在腳本中是一個(gè)單一的數(shù)組。如果想在僅僅一個(gè) cookie 中設(shè)定多個(gè)值,考慮先在值上使用 serialize()explode()

注意在瀏覽器中一個(gè) cookie 會(huì)替換掉上一個(gè)同名的 cookie,除非路徑或者域不同。因此對(duì)于購物車程序可以保留一個(gè)計(jì)數(shù)器并一起傳遞,例如:

示例 #4 一個(gè) setcookie() 的示例

<?php
if (isset($_COOKIE['count'])) {
    
$count $_COOKIE['count'] + 1;
} else {
    
$count 1;
}
setcookie('count'$counttime()+3600);
setcookie("Cart[$count]"$itemtime()+3600);
?>

變量名中的點(diǎn)

通常,PHP 不會(huì)改變傳遞給腳本中的變量名。然而應(yīng)該注意到點(diǎn)(句號(hào))不是 PHP 變量名中的合法字符。至于原因,看看:

<?php
$varname
.ext;  /* 非法變量名 */
?>
這時(shí),解析器看到是一個(gè)名為 $varname 的變量,后面跟著一個(gè)字符串連接運(yùn)算符,后面跟著一個(gè)裸字符串(即沒有加引號(hào)的字符串,且不匹配任何已知的健名或保留字)'ext'。很明顯這不是想要的結(jié)果。

出于此原因,要注意 PHP 將會(huì)自動(dòng)將變量名中的點(diǎn)替換成下劃線。

確定變量類型

因?yàn)?PHP 會(huì)判斷變量類型并在需要時(shí)進(jìn)行轉(zhuǎn)換(通常情況下),因此在某一時(shí)刻給定的變量是何種類型并不明顯。PHP 包括幾個(gè)函數(shù)可以判斷變量的類型,例如:gettype(),is_array(),is_float()is_int(),is_object()is_string()。參見類型一章。

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

更新日志

版本 說明
7.2.34, 7.3.23, 7.4.11 The names of incoming cookies are no longer url-decoded for security reasons.