PHP教學-表單處理
PHP 超全域變數 $_GET 和 $_POST 用於收集表單資料(form-data)。
PHP - 一個簡單的 HTML 表單
PHP - 一個簡單的 HTML 表單
下面的例子顯示了一個簡單的 HTML 表單,它包含兩個輸入字段和一個提交按鈕:
範例
範例
<html> <body> <form action="welcome.php" method="post"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html>
當用戶填寫此表單並點擊提交按鈕後,表單資料會發送到名為 "welcome.php" 的 PHP 文件供處理。表單資料是通過 HTTP POST 方法發送的。
如需顯示出被提交的資料,您可以簡單地輸出(echo)所有變數。"welcome.php" 文件是這樣的:
<html> <body> Welcome <?php echo $_POST["name"]; ?><br> Your email address is: <?php echo $_POST["email"]; ?> </body> </html>
輸出:
Welcome John
Your email address is john.doe@example.com
Your email address is john.doe@example.com
使用 HTTP GET 方法也能得到相同的結果:
範例
範例
<html> <body> <form action="welcome_get.php" method="get"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html>
"welcome_get.php" 是這樣的:
<html> <body> Welcome <?php echo $_GET["name"]; ?><br> Your email address is: <?php echo $_GET["email"]; ?> </body> </html>
上面的程式碼很簡單。不過,最重要的內容被漏掉了。您需要對表單資料進行驗證,以防止scripts出現漏洞。
注意:在處理 PHP 表單時請關注安全!
本頁未包含任何表單驗證程式,它只向我們展示如何發送並接收表單資料。
不過稍後的章節會為您講解如何提高 PHP 表單的安全性!對表單適當的安全驗證對於抵禦黑客攻擊和垃圾郵件非常重要!
GET vs. POST
GET 和 POST 都新增陣列(例如,array( key => value, key2 => value2, key3 => value3, ...))。此陣列包含鍵/值對,其中的鍵是表單控件的名稱,而值是來自用戶的輸入資料。
GET 和 POST 被視作 $_GET 和 $_POST。它們是超全域變數,這意味著對它們的訪問無需考慮作用域 - 無需任何特殊程式碼,您能夠從任何函數、類或文件訪問它們。
$_GET 是通過 URL 參數傳遞到當前scripts的變數陣列。
$_POST 是通過 HTTP POST 傳遞到當前scripts的變數陣列。
何時使用 GET?
通過 GET 方法從表單發送的訊息對任何人都是可見的(所有變數名和值都顯示在 URL 中)。GET 對所發送訊息的數量也有限制。限制在大於 2000 個字符。不過,由於變數顯示在 URL 中,把頁面增加到書籤中也更為方便。
GET 可用於發送非敏感的資料。
註釋:絕不能使用 GET 來發送密碼或其他敏感訊息!
何時使用 POST?
通過 POST 方法從表單發送的訊息對其他人是不可見的(所有名稱/值會被嵌入 HTTP 請求的主體中),並且對所發送訊息的數量也無限制。
此外 POST 支持高階功能,比如在向伺服器上傳文件時進行 multi-part 二進制輸入。
不過,由於變數未顯示在 URL 中,也就無法將頁面增加到書籤。
提示:開發者偏愛 POST 來發送表單資料。
HTTP GET 與 POST 的比較及使用時機
GET | POST | |
---|---|---|
瀏覽器歷史紀錄 | 參數都會紀錄,因為都是URL的一部分 | 參數都不會紀錄 |
加入書籤 | 參數都會紀錄,因為都是URL的一部分 | 參數都不會紀錄 |
回上一頁/ 重新載入 | GET請求是重新執行,但被存儲在瀏覽器的快取,則不被重新提交到服務器 | 數據將被重新提交(瀏覽器通常會警告使用者該數據將需要重新提交) |
編碼類型 | application/x-www-form-urlencoded | multipart/form-data 或 application/x-www-form-urlencoded,使用多編碼的二進制數據 |
參數大小限制 | 受限於 QueryString 長度限制(不超過 2KB 是最保險的,有些瀏覽器可以允許多達 64KB) | 允許大量傳輸,包括上傳文件到服務器 |
參數傳輸方式 | QueryString | POST Data(message-body) |
安全性 | 容易破解,因為參數是網址的一部分,所以它被紀錄在瀏覽器歷史記錄和明文服務器日誌 | 比較難破解 |
使用性 | 不應該被使用在發送密碼或其他敏感信息上 | 使用在發送密碼或其他敏感信息上 |
能見度 | GET方法是對所有人可見(它會顯示在瀏覽器的地址欄) | POST方法變量不顯示在URL中 |
執行速度 | 快,GET 比 POST 快 1.5 倍 | 慢,POST 多出需要發送數據的步驟 |
快取 | 瀏覽器會依據網址來快取資料,不同的網址有不同的快取 | 瀏覽器不會快取 |
自動重送 | 會,在回應過長時會重發請求,直到重試結束 | 不會,一個請求發出後會一直等待回應 |
適用行為 | 檢視(Read) | 新增(Create)、修改(Update)、刪除(Delete) |
情況包括 | 透過 <link href="">、<img src="">、<script src="">、<iframe src=""> 額外載入的 JavaScritp、CSS、圖片 | 透過 <form method="post"> 以及 Ajax post 發送的請求 |
GET 適合用在「檢視(Read)」 的操作行為,由於檢視資料的操作會遠比資料異動來的更頻繁,所以需要更快的回應,而且有快取可以加快 二次檢視,參數在網址上可以使每一個網址都代表一個網頁,在加入書籤的連結能夠返回對應的網頁,再者所需要的參數很少(例如:id=122& type=1),對於資料異動後快取沒更新的問題,可以在 QueryString 加上資料最後修改的時間戳記(例如:id=122&type=1&t=1392183597718)。
POST 適合用在「新增(Create)、修改(Update)、刪除(Delete)」 的操作行為,資料 異動所需要傳送的參數很可能超過 QueryString 的限制,不適合用 GET 來處理資料異動的傳送,GET 在等待過久會重新發送請求,這會造成重複的請求,如果在新增儲存就多新增一筆資料,而 POST 在一個請求發出後會一直等待回應,這可以保障在傳送的過程中請求是唯一的,新增資料的請求如果被記錄在書籤或歷史紀錄中,使用者點擊連結網址就新增一筆資 料,這真是一件恐怖的事,所以在資料異動上的請求必須使用 POST 來傳送。
留言
張貼留言