PHP教學-表單處理


PHP 超全域變數 $_GET 和 $_POST 用於收集表單資料(form-data)。
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

使用 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 的比較及使用時機


GETPOST
瀏覽器歷史紀錄參數都會紀錄,因為都是URL的一部分參數都不會紀錄
加入書籤參數都會紀錄,因為都是URL的一部分參數都不會紀錄
回上一頁/
重新載入
GET請求是重新執行,但被存儲在瀏覽器的快取,則不被重新提交到服務器數據將被重新提交(瀏覽器通常會警告使用者該數據將需要重新提交)
編碼類型application/x-www-form-urlencodedmultipart/form-data 或 application/x-www-form-urlencoded,使用多編碼的二進制數據
參數大小限制受限於 QueryString 長度限制(不超過 2KB 是最保險的,有些瀏覽器可以允許多達 64KB)允許大量傳輸,包括上傳文件到服務器
參數傳輸方式QueryStringPOST 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 來傳送。

留言

這個網誌中的熱門文章

c語言-關於#define用法

CMD常用網管指令

PHP 與 JavaScript 之間傳值利用 json