PHP 的外部變數

HTML 表單(GET 和 POST)

當一個表單體交給 PHP 指令碼時,表單中的資訊會自動在指令碼中可用。有很多方法訪問此資訊,例如:

一個簡單的 HTML 表單

<form action="foo.php" method="POST">
Name: <input type="text" name="username">
Email: <input type="text" name="email">
<input type="submit" name="submit" value="Submit me!">
</form>

根據特定的設定和個人的喜好,有很多種方法訪問 HTML 表單中的資料。例如:

從一個簡單的 POST HTML 表單訪問資料

<?php
// 自 PHP 4.1.0 起可用 print $_POST['username'];
print $_REQUEST['username']; import_request_variables('p', 'p_');
print $p_username; // 自 PHP 3 起可用。自 PHP 5.0.0 起,這些較長的預定義變數
// 可用 register_long_arrays 指令關閉。 print $HTTP_POST_VARS['username']; // 如果 PHP 指令 register_globals = on 時可用。不過自
// PHP 4.2.0 起預設值為 register_globals = off。
// 不提倡使用/依賴此種方法。 print $username;
?>

使用 GET 表單也類似,只不過要用適當的 GET 預定義變數。GET 也適用於 QUERY_STRING(URL 中在“?”之後的資訊)。因此,舉例說,http://www.example.com/test.php?id=3 包含有可用 $_GET['id'] 訪問的 GET 資料。參見 $_REQUEST 和 import_request_variables()。

注: 超全域性變數陣列,和 $_POST 以及 $_GET 一樣,自 PHP 4.1.0 起可用。

如同所示,在 PHP 4.2.0 之前 register_globals 的預設值是 on。在 PHP 3 中其值總是 on。PHP 社群鼓勵大家不要依賴此指令,建議在編碼時假定其為 off。

注: magic_quotes_gpc 配置指令影響到 Get,Post 和 Cookie 的值。如果開啟,值 (It's "PHP!") 會自動轉換成 (It\'s \"PHP!\")。資料庫的插入就需要轉義。參見 addslashes(),stripslashes() 和 magic_quotes_sybase。

PHP 也懂得表單變數上下文中的陣列(參見相關常見問題)。例如可以將相關的變數編成組,或者用此特性從多選輸入框中取得值。例如,將一個表單 POST 給自己並在提交時顯示資料:

更復雜的表單變數

<?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="data:image.gif" name="sub">

當用戶點選到影象中的某處時,相應的表單會被傳送到伺服器,並加上兩個變數 sub_x 和 sub_y。它們包含了使用者點選影象的座標。有經驗的使用者可能會注意到被瀏覽器傳送的實際變數名包含的是一個點而不是下劃線,但 PHP 自動將點轉換成了下劃線。

HTTP Cookies

PHP 透明地支援 Netscape 規範定義中的 HTTP cookies。Cookies 是一種在遠端瀏覽器端儲存資料並能追蹤或識別再次訪問的使用者的機制。可以用 setcookie() 函式設定 cookies。Cookies 是 HTTP 資訊頭中的一部分,因此 SetCookie 函式必須在向瀏覽器傳送任何輸出之前呼叫。對於 header() 函式也有同樣的限制。Cookie 資料會在相應的 cookie 資料陣列中可用,例如 $_COOKIE,$HTTP_COOKIE_VARS 和 $_REQUEST。更多細節和例子見 setcookie() 手冊頁面。

如果要將多個值賦給一個 cookie 變數,必須將其賦成陣列。例如:

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

這將會建立兩個單獨的 cookie,儘管 MyCookie 在指令碼中是一個單一的陣列。如果想在僅僅一個 cookie 中設定多個值,考慮先在值上使用 serialize() 或 explode()。

注意在瀏覽器中一個 cookie 會替換掉上一個同名的 cookie,除非路徑或者域不同。因此對於購物框程式可以保留一個計數器並一起傳遞。

一個 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 不會改變傳遞給指令碼中的變數名。然而應該注意到點(dot,period,full stop)不是 PHP 變數名中的合法字元。至於原因,看看:

<?php
$varname.ext; /* 非法變數名 */
?>

這時,解析器看到是一個名為 $varname 的變數,後面跟著一個字串連線運算子,後面跟著一個裸字串(例如沒有加引號的字串,且不匹配任何已知的健名或保留字)'ext'。很明顯這不是想要的結果。

出於此原因,要注意 PHP 將會自動將變數名中的點替換成下劃線。

確定變數型別

因為 PHP 會判斷變數型別並在需要時進行轉換(通常情況下),因此在某一時刻給定的變數是何種型別並不明顯。PHP 包括幾個函式可以判斷變數的型別,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。參見型別一章。