2024 年 PHP 日本研討會

來自外部來源的變數

HTML 表單 (GET 和 POST)

當表單提交到 PHP 腳本時,該表單中的資訊會自動提供給腳本。有幾種方法可以存取這些資訊,例如

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

只有兩種方法可以從 HTML 表單存取資料。目前可用的方法如下所示

範例 #2 從簡單的 POST HTML 表單存取資料

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

使用 GET 表單也類似,只是可以使用對應的 GET 預定義變數。GET 也適用於 QUERY_STRING(URL 中 '?' 後面的資訊)。因此,例如,http://www.example.com/test.php?id=3 包含可以使用 $_GET['id'] 存取的 GET 資料。另請參閱 $_REQUEST

注意:

變數名稱中的點號和空格會轉換為底線。例如,<input name="a.b" /> 會變成 $_REQUEST["a_b"]

PHP 也能理解表單變數上下文中的陣列(請參閱相關常見問題)。例如,相關的變數可以組合在一起,或者可以使用此功能從多選輸入中擷取值。例如,讓我們將表單提交給自身,並在提交後顯示數據

範例 #3 更複雜的表單變數

<?php
if ($_POST) {
echo
'<pre>';
echo
htmlspecialchars(print_r($_POST, true));
echo
'</pre>';
}
?>
<form action="" method="post">
姓名:<input type="text" name="personal[name]" /><br />
電子郵件:<input type="text" name="personal[email]" /><br />
啤酒:<br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="提交!" />
</form>

注意如果外部變數名稱以有效的陣列語法開頭,則尾隨字元將被靜默忽略。例如,<input name="foo[bar]baz"> 會變成 $_REQUEST['foo']['bar']

圖片提交變數名稱

提交表單時,可以使用圖片代替標準的提交按鈕,例如:

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

當使用者點擊圖片上的某個位置時,隨附的表單將會傳輸到伺服器,並帶有兩個額外的變數:sub_xsub_y。這些變數包含使用者在圖片中點擊的座標。有經驗的開發者可能會注意到,瀏覽器實際發送的變數名稱包含一個點號而不是底線,但 PHP 會自動將點號轉換為底線。

HTTP Cookies

PHP 完全支援 » RFC 6265 中定義的 HTTP Cookies。Cookies 是一種在遠端瀏覽器中儲存數據的機制,因此可以追蹤或識別返回的使用者。可以使用 setcookie() 函式設定 Cookies。Cookies 是 HTTP 標頭的一部分,因此必須在任何輸出發送到瀏覽器之前呼叫 SetCookie 函式。這與 header() 函式的限制相同。Cookie 數據可在適當的 Cookie 數據陣列中使用,例如 $_COOKIE 以及 $_REQUEST。有關更多詳細資訊和範例,請參閱 setcookie() 函式手冊頁面。

注意從 PHP 7.2.34、7.3.23 和 7.4.11 開始,基於安全考量,傳入 Cookie 的*名稱*不再進行 URL 解碼。

如果要將多個值賦予單個 Cookie 變數,可以將它們賦予為陣列。例如:

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

這樣會建立兩個不同的 Cookie,雖然在腳本中 MyCookie 現在會是一個單一陣列。如果只想設定一個包含多個值的 Cookie,請考慮先使用 serialize()explode() 處理該值。

請注意,除非路徑或網域不同,否則 Cookie 會取代瀏覽器中先前同名的 Cookie。因此,對於購物車應用程式,可以保留一個計數器並傳遞它。例如:

範例 #4 一個 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 在變數傳入腳本時不會更改其名稱。但是,應注意的是,點(句點)在 PHP 變數名稱中不是有效字元。原因如下:

<?php
$varname
.ext; /* 無效的變數名稱 */
?>
解析器看到的是一個名為 $varname 的變數,後跟字串串接運算子,再後跟一個裸字串(即不帶引號的字串,不符合任何已知鍵或保留字) 'ext'。顯然,這沒有達到預期的結果。

因此,務必注意,PHP 會自動將傳入變數名稱中的任何點替換為底線。

判斷變數類型

由於 PHP 會判斷變數的類型並(通常)根據需要進行轉換,因此在任何時候,特定變數的類型並不總是顯而易見的。PHP 包含幾個函式可以找出變數的類型,例如:gettype()is_array()is_float()is_int()is_object()is_string()。另請參閱關於類型的章節。

由於 HTTP 是一個文字通訊協定,大多數(如果不是全部)來自超全域陣列(例如 $_POST$_GET)的內容都將保留為字串。PHP 不會嘗試將值轉換為特定類型。在以下範例中,$_GET["var1"] 將包含字串 "null",而 $_GET["var2"] 則包含字串 "123"。

/index.php?var1=null&var2=123

更新日誌

版本 說明
7.2.34, 7.3.23, 7.4.11 基於安全性考量,傳入 Cookie 的*名稱*不再進行 URL 解碼。

新增註記

使用者貢獻的註記 2 則註記

匿名
16 年前
PHP 轉換為 _(底線)的欄位名稱字元完整列表如下(不僅僅是點)
chr(32) ( ) (空格)
chr(46) (.) (點)
chr(91) ([) (左方括號)
chr(128) - chr(159) (各種)

為了維持與已棄用的 register_globals 功能的相容性,PHP 會不可逆地修改包含這些字元的欄位名稱。
krydprz at iit dot edu
19 年前
這篇文章是關於處理具有多個提交按鈕的表單。

假設我們有一個 HTML 表單,其中一個提交按鈕的規格如下:

<input type="submit" value="刪除" name="action_button">

通常,建立提交按鈕的 HTML `input` 標籤的 `value` 屬性(在這個例子中是「刪除」)可以在發佈後像這樣在 PHP 中存取:

<?php
$_POST
['action_button'];
?>

我們當然使用按鈕的 `name` 作為 $_POST 陣列的索引。

這個方法可以正常運作,除非我們想要透過點擊這個特定按鈕傳遞更多資訊。

想像一下在某些管理介面中處理使用者管理的情況。您會看到一個從資料庫查詢的使用者名稱列表,並希望在列表中每個名稱旁邊新增「刪除」和「修改」按鈕。自然地,我們想要顯示的 HTML 表單中按鈕的 `value` 將是「刪除」和「修改」,因為這就是我們希望顯示在按鈕面板上的內容。

兩個按鈕(修改和刪除)都會被命名為 "action_button",因為我們要用它來索引 $_POST 陣列。換句話說,如果我們想要在提交後系統地處理這些按鈕,那麼單靠按鈕的「名稱」屬性無法攜帶任何獨特的識別資訊。由於這些按鈕會針對列表中的每個使用者而存在,因此我們需要其他方法來區分它們,以便知道按下的是哪個使用者的按鈕。

使用陣列是個好方法。假設我們知道每個使用者的唯一數字識別符,例如資料庫中的主鍵,而且我們*不*希望對大眾隱藏這個數字,我們可以將 'action_button' 變成一個陣列,並使用使用者的唯一數字識別符作為此陣列中的鍵值。

我們用來顯示按鈕的 HTML 程式碼將變成:

<input type="submit" value="刪除" name="action_button[0000000002]">
<input type="submit" value="修改" name="action_button[0000000002]">

當然,0000000002 是此特定使用者的唯一數字識別符。

然後,當我們在 PHP 中處理這個表單時,需要執行以下操作來提取按鈕的「值」(「刪除」或「修改」)以及我們想要影響的使用者之唯一數字識別符(在本例中為 0000000002)。以下程式碼將會印出「修改」或「刪除」,以及使用者的唯一編號。

<?php
$submitted_array
= array_keys($_POST['action_button']);
echo (
$_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]);
?>

`$submitted_array[0]` 存放 0000000002。
當我們像上面那樣用它來索引 `$_POST['action_button']` 時,我們將提取在建立此按鈕的 HTML 程式碼 `input` 標籤中用作「值」的字串。

如果我們希望保護唯一的數字識別符,我們必須使用每個使用者的其他唯一識別屬性。為了提高安全性,該屬性在輸出到表單時可能應該被加密。

祝您使用愉快!
To Top