外部傳遞變數

概述及用途
    除了在程式中自行指定變數之外,PHP 也可以透過 form 的 GET/POST、cookie、外加參數的方式,或是從環境變數中取得外來的變數值。

 自 PHP 4.2.0 起,為了強化系統安全,在 php.ini 裡頭的 register_globals 選項被預設為 off;如此一來,外部變數的讀取將更為嚴謹。在 register_globals 設為 on 時,我們只要在變數名稱前方加上 $ 符號,即可取用變數的值;但現在要改用 $_xxxx['變數名稱'] 的方式才行,xxxx 所指的包括 GET、POST、COOKIE、FILES、REQUEST、SESSION、SERVER 與 ENV。

 例如,我們要讀取一個以 GET 方式傳入的外部變數,請用 $_GET['變數名稱'];要讀取一個 cookie 的值,請用 $_COOKIE['變數名稱'];要讀取一個 session 變數的值,請用 $_SESSION['變數名稱']。

    這裡先介紹GET及POST,其它變數視情況另行介紹。利用Get方式傳送資料時,是將資料直接加在URL後,安全性較差;而Post方式傳送則是先將資料轉成標準輸入再傳送,不會顯示在URL後,較安全。

使用說明與範例

說明     一般Server端要取得Client端所輸入的資料都是透過HTML From表單來傳送,而傳送的方式(method)有Get、Post二種。以下概述:

Form之用法
<Form name = "Form Name"
           action = "資料處理程式的URI"
           method = "GET/POST"
           target = "顯示資料處理程式的視窗名稱"
           enctype = "application/x-www-form-urlencoded/multipart/form-data"
           OnReset = "事件處理程序"
           OnSubmit = "事件處理程序">
………
</Form>

參數說明

    name 係指該 form 的名稱,例如:UserLogin。在事件處理程序中,若要存取本 form 的任何資料時,您可以用 document.UserLogin 來稱呼它;如果省略不寫的話,您也可以用 document.forms[0] 來稱呼它(說明:forms[0] 係指網頁中的第一個 form 而言,若還有第二個、第三個 form 的話,請依序用 forms[1], forms[2])。
 action 係指該 form 被使用者送出之後,負責接收與處理資料的程式之 URI(Uniform Resource Identifiers)。如果省略不寫的話,IE 會以該 form 所在程式的 URI 取代之,Netscape 則不會。
 method 用以規範該 form 被送出時,所採用的 HTTP method,預設值是 GET。
 POST 方法是將資料包裝在 HTTP 標頭內傳送給 Web server;而 GET 方法則是將資料直接加在 URI 之後。
 使用 GET method 所能傳遞的資料有限(連同 URI 共 255 字元),在需要上傳大量資料或檔案時,請使用 POST method。
 不過,由於 GET method 係將資料直接加在 URI 之後,所以對瀏覽器而言,它將被視為 URI 的一部份,也能被 cache 在使用者端的電腦中,不至於在畫面上看到「警告:網頁已經過期......」的字句。
 target 指的是負責接收與處理資料的程式所在的視窗或 Frame 名稱。如果不指定的話,則預設為原來的視窗或 Frame。
 enctype 用以規範該 form 被送出時,所採用的 content type。可用的值有兩種:application/x-www-form-urlencoded(預設值)與 multipart/form-data。
 當您打算透過表單來上傳檔案時,請務必將 enctype 設為 multipart/form-data,同時 method 也要設為 POST 才行
 OnReset 可以用來設定使用者按下 RESET 鍵時,您希望觸發的事件處理程序。
 OnSubmit 可以用來設定使用者按下 SUBMIT 鍵或是點選 IMAGE 元件時,您希望觸發的事件處理程序。例如:OnSubmit="return Final_Check( );"。
 Final_Check( ) 是一個自定的函數,用來檢查使用者的輸入內容。若通過它的檢查(傳回 true),則該 form 的資料得以送出;否則(傳回 false),瀏覽器會擱置 submit 的動作。
範例 POST方法之html程式碼
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
</head>
<body>
<form name="form1" method="post" action="demo1-34.php">
<input type="text" name="test"><br>
<input type="submit" name="Submit" value="送出">
<input type="reset" name="Submit2" value="重設">
</form>
</body>
</html>
PHP顯示處理部份 顯示結果
<?php
echo "從表單取得\$_POST['test']:",$_POST['test'];
echo "<br>從表單取得\$test:",$test;
//第二行的值在register_globals="on"才會出現
echo "<br>",var_dump($_POST);
?>
範例 GET方法之html程式碼
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>無標題文件</title>
</head>
<body>
<form name="form1" method="get" action="demo1-35.php">
<input type="text" name="test"><br>
<input type="submit" name="Submit" value="送出">
<input type="reset" name="Submit2" value="重設">
</form>
</body>
</html>
PHP顯示處理部份 顯示結果
<?php
echo "從表單取得\$_GET['test']:",$_GET['test'];
echo "<br>從表單取得\$test:",$test;
//第二行的值在register_globals="on"才會出現
echo "<br>",var_dump($_GET);
?>
附註     上面的範例說明了POST及GET的使用方式,注意觀察網址列的最後有什麼不同?另外
,在程式的最後我們利用顯示陣列的方式將$_POST和$_GET變數顯示出來,發現到其實POST和GET方法是將資料存成陣列,藉此了解其工作方式,底下列出幾個外部傳遞變數陣列:
   
$_COOKIE - 包含 cookie 的變數。
    $_ENV - 包函主機的環境變數。
    $_FILES - 包含上傳的檔案資訊。
    $_GET - 包含 http get 的變數。
    $_POST - 包含 http post 的變數。
    $_REQUEST - 包含 $_GET, $_POST, $_COOKIE 的變數。
    $_SERVER - 包含主機的資料變數。
    $GLOBALS - 包含全部的全域變數。
 
補充 外加參數
我們可以將變數以參數的型式直接定在 URL 後面,例如:
 http://search.yam.com/wps?k=php&p=1
 使用時需注意以下原則:
  • 程式之路徑、名稱與變數資料之間以「?」分隔
  • 變數值的指定方式為:變數名稱 = 值。變數名稱前不必加上「$」
  • 需傳遞多個變數時,變數資料之間要用「&」隔開
  • 特殊字元(中文)需經十六進位編碼處理,方能傳遞
  • 程式之路徑、名稱與變數資料之總長度需控制在 2083 個字元之內
  • 參數值可用 $_GET 讀回來再加以利用