技術討論區 > PHP程式設計討論區

SA.PHP觀念教室 首部曲:了解$_POST,$_GET

<< < (2/4) > >>

alva:
優哦...!

我家如果在"饒河夜市" , 我可能也會常常睡不著 

希望你常常睡不者 :D:D:D

學飛的小鳥:

--- 引述: "Darkhero" ---
由於 html 表單傳遞資料的時候分為兩種方法
1 GET 將資料於 url 中一併送出. 會於網址列顯示像是 http://url/xxx.php?欄位名稱=欄位值
2 POST 將資料於http request 時,於表頭中直接送出,所以該資料並不會以 http://url/xxx.php?欄位名稱=欄位值 的方式出現在瀏覽器的網址列

而表單設定的方式則是如下.

--- 代碼: ---<form method="get">
--- 程式碼結尾 ---


--- 代碼: ---<form method="post">
--- 程式碼結尾 ---


而什麼時候會用到 get ? 什麼時候又要用 post 呢?...

通常使用 post 都是在只能送出一次的資料,像是留言版的留言.會員的登入資料,或是註冊表等.

而 get 的使用通常是在可以重複,且是用來判斷目前所在位置的情況,像製作換頁功能的時候,用來帶入該頁數,或是像 phpbb2 利用 get 取得目前使用的功能與目前觀看的版面編號等. :D
--- 引用結尾 ---


剛剛看到這裏, 有一點點迷惑.....
印象中, get 適用於上傳資料量少或是要追蹤 url 串列時,
因為 get 的資料是存放在 php 的環境變數內, 所以容量有限,
而且get 資料會完整的儲存在 $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']變數內..

post 是上傳較大資料量的方式, 或是想保留上傳資料原始格式的時候,
例如上傳檔案, 檔案資料不會做任何編碼, server 端可以直接存檔...
server 端的CGI程式(如php、perl or asp...)可以用讀取"標準輸入"的方式取得資料.

另外 post 的資料不會列在url, 有保密的功能,
如果要上傳帳號密碼之類的資料通常都用 post, 這樣密碼就不會顯示在url...

post 資料通常是相同的資料只上傳一次, 而且資料量可能很大,
post 之後, 如果回上一頁, 會顯示網頁已過期(或其他警告訊息)提醒瀏覽者...
所以, 像是上傳文章之類的功能, 也都是用 post

Darkhero:

--- 引述: "學飛的小鳥" ---
--- 引述: "Darkhero" ---
由於 html 表單傳遞資料的時候分為兩種方法
1 GET 將資料於 url 中一併送出. 會於網址列顯示像是 http://url/xxx.php?欄位名稱=欄位值
2 POST 將資料於http request 時,於表頭中直接送出,所以該資料並不會以 http://url/xxx.php?欄位名稱=欄位值 的方式出現在瀏覽器的網址列

而表單設定的方式則是如下.

--- 代碼: ---<form method="get">
--- 程式碼結尾 ---


--- 代碼: ---<form method="post">
--- 程式碼結尾 ---


而什麼時候會用到 get ? 什麼時候又要用 post 呢?...

通常使用 post 都是在只能送出一次的資料,像是留言版的留言.會員的登入資料,或是註冊表等.

而 get 的使用通常是在可以重複,且是用來判斷目前所在位置的情況,像製作換頁功能的時候,用來帶入該頁數,或是像 phpbb2 利用 get 取得目前使用的功能與目前觀看的版面編號等. :D
--- 引用結尾 ---


剛剛看到這裏, 有一點點迷惑.....
印象中, get 適用於上傳資料量少或是要追蹤 url 串列時,
因為 get 的資料是存放在 php 的環境變數內, 所以容量有限,
而且get 資料會完整的儲存在 $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']變數內..

post 是上傳較大資料量的方式, 或是想保留上傳資料原始格式的時候,
例如上傳檔案, 檔案資料不會做任何編碼, server 端可以直接存檔...
server 端的CGI程式(如php、perl or asp...)可以用讀取"標準輸入"的方式取得資料.

另外 post 的資料不會列在url, 有保密的功能,
如果要上傳帳號密碼之類的資料通常都用 post, 這樣密碼就不會顯示在url...

post 資料通常是相同的資料只上傳一次, 而且資料量可能很大,
post 之後, 如果回上一頁, 會顯示網頁已過期(或其他警告訊息)提醒瀏覽者...
所以, 像是上傳文章之類的功能, 也都是用 post
--- 引用結尾 ---


感謝您的回應...

基本上兩種說法都可以...

GET 的訊息的確是有不安全的疑慮. 所以適合用在不會改變資料庫內容的功能.
POST 則不一定是為了作資料保密喔.
post 的資料也是以明碼傳送的.除非整個連線session是使用 ssl 加密過.

或許用實例會更清楚...
以最常見的使用 get 的方式來說,應該就是所謂的分頁功能了.
分頁功能,並不會牽涉到任何資料的改變.且也沒有資料保密的需求,再加上該頁面可以接受不斷的reload或是將網址Copy下來保存甚至傳給其他人看.

post 最常則是用在 登入(帳號密碼不適合放在網址,且登入也不會是可以一重複的.且登入的時候會改變資料庫存入使用者登入時間,以及保存該次的sessionID等,也是一種改變資料庫囉),發表文章(除了長度以外,他會改變資料庫資料表,所以不應該讓使用者會重複該頁). 填寫問卷,聯絡站長表單. 等...

而再前面對於 GET 的部份則有一種例外....
應該採用sessionc來處理.
那就是列出使用者個人資訊的功能.

這部份雖然不會修改資料也不會造成資料庫內容改變,但是由於資料內容本身應該是要保密的,所以應該採用將該 username 的 value 存放在 session 中,而非採用 get 取得來顯示會員個人資料唷!!..
相信很多朋友有看過新聞,XX銀行線上信用卡申請表的result頁,採用get的方式顯示使用者申請的內容,且是連續的序號..所以造成資料外流的軒然大波.

希望這樣說明能更明白囉..^_^..

FIEND:
get  在 ie 上預設長度限制 為 2k

而 在 firefox 上則為 4k 在寫php 時請小心注意 使用

若 丢出來的字串長度太長 請 使用 post 避免 程式錯誤

get 最大的好處是可以運用在 版型邏輯 及 內容邏輯層的帶入參數

也可以做 快取的依據 ..

 這要視個人在規劃系統上的 習慣了


例如 我在規劃系統時


search

record

page

relation

sort

insert

delete

update

這些 都是時常出現的

要帶什麼 get 或 post 才會使系統富有一致性和延展性都是要深思熟慮的

提供參考 歡迎指教 ..

FIEND:
安全性的問題的話

超全域陣列變數 php.ini 有設定可以擋住 injection 的字元

但是建議大家在 寫入 db 時

加入 mysql_escape_string 或是 addslashes 可以 過濾 injection 的攻擊方式

導覽

[0] 文章列表

[#] 下頁

[*] 上頁

前往完整版本