程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP表單提交數據之get,post實例詳解

PHP表單提交數據之get,post實例詳解

編輯:關於PHP編程

本文章來給大家介紹一個入門教程關於PHP表單提交數據之get,post實例,有需要了解的同學可進入參考參考。

1.什麼是表單

所謂表單,說簡單點就是一對form標簽。即:<form></form> 。

2.表單的作用

表單的作用是采集客戶端提交的數據,並把數據提交給服務端。

比如在登錄一個網站時,你需要輸入自己的用戶名和密碼才能登陸。又比如你注冊游戲賬號時,你需要填寫自己的郵箱、密碼、年齡等等。

這些操作就要通過表單提交給服務器,最後由服務器記錄在數據庫。(不是所有)
3.表單的組成

表單的兩個標簽必須是成對出現的:<form></form>。

form標簽有兩個必填的屬性 : action,method。

action的作用是指定要提交到服務器的地址,比如我要提交到本站的info.php文件,那麼就寫成<form  action=”http://www./info.php“>

,本站的文件寫相對路徑就可以了:<form  action=”info.php“>

method屬性,顧名思義就是提交數據的方法,它有兩個值可選:post/get ,post是隱藏傳遞,get是地址欄傳遞。具體不同請參閱文章《form的get和post 詳細分析區別》。

如果用get傳遞,以上就可以寫成:<form  action=”info.php“   method=”get”>

form標簽中可以添加文本框,比如用戶填寫用戶名和密碼的:

用戶名:<input    type=”text”   name=”username”  value=”"  />

密    碼:<input    type=”password”  name=”password”  value=”"  />

也可以多行文本textarea等:

<textarea  name=”content”></textarea>

最後加一個提交按鈕和一個重置按鈕:

<input   type=”submit”  value=”提交”/>

<input   type=”reset”  value=”重置”/>

細心的童鞋可以看出,以上的幾個標簽除了提交、重置和form表單外,我都有些name屬性,因為服務端是通過標簽的name屬性來獲取它的值的。

4.那麼在info.php中如何獲取數據的呢?

有三種方式:$_GET,$_POST,$_REQUEST。

$_GET只能獲取get方法提交的數據,$_POST方法只能獲取post方法提交的數據,而$_REQUEST能同時獲取get和post方法提交的數據。

比如要得到用戶輸入的用戶名和密碼的值,就是 $_GET["username"] 和$_GET["password"],或者$_REQUEST["username"] 和$_REQUEST["password"]

以下是實例代碼:

創建  test.html文件,內容:

 代碼如下 復制代碼

<form  action=”info.php“   method=”get”>

用戶名:<input    type=”text”   name=”username”  value=”"  /><br/>

密    碼:<input    type=”password”  name=”password”  value=”"  /><br/>

<input   type=”submit”  value=”提交”/>

<input   type=”reset”  value=”重置”/>

</form>

再創建info.php文件,內容:

 代碼如下 復制代碼

<?php

$username = $_GET["username"];     //獲取用戶名

$password = $_GET["password"];     //獲取密碼

//打印輸出

echo “您輸入的用戶名為:” . $username . “,密碼為:”. $password ;

?>

友情提示:以上所有引號和分號均為英文狀態下的引號和分號,中文的話會報錯滴!!如有中文引號請自行修改 ^^


理解form的get和post

在HTML中,form元素用method屬性來指定有兩種不同的提交方法,即”get”(默認值)和”post”。
1. get和post的定義

W3C的HTML 4.01 specification說,form元素的method屬性用來指定發送form的HTTP方法。

* 使用get時,form的數據集(形如control-name=current-value的鍵值對)被附加到form元素的action屬性所指定的URI後面;
* 使用post時,form的數據集(形如control-name=current-value的鍵值對)被包裝在請求的body中並被發送。

這可以簡單地理解為,get僅僅是拼接一個URI,然後直接向服務器請求數據(需要提交給服務器的數據集包含在URI中)。比如:

<form action=”FormGet.aspx” method=”get”> <input name=”ProductID” type=”text” value=”1″ />
<input type=”submit” value=”Get” />
</form>這個form在提交的時候,會產生這樣能夠一個get請求:FormGet.aspx?ProductID=1。

而post會把form的數據集,即ProductID=1這個鍵值對包裝在請求的body中,發送給服務器,然後向服務器請求數據。對於:

<form action=”FormPost.aspx” method=”post”> <input name=”ProductID” type=”text” value=”1″ />
<input type=”submit” value=”Get” />
</form>這樣一個form在提交時,我們將看到一個干淨的URI:FormPost.aspx。因為數據不是拼接在URI中。
2. get和post的區別
2.1 安全性

如果用get提交一個驗證用戶名和密碼的form,一般認為是不安全的。因為用戶名和密碼將出現在URL上,進而出現在浏覽器的歷史記錄中。顯然,在對安全性有要求的情況下,應該使用post。
2.2 編碼

HTML 4.01 specification指出,get只能向服務器發送ASCII字符,而post則可以發送整個ISO10646中的字符(如果同時指定enctype=”multipart/form-data”的話)。

注意get和post對應的enctype屬性有區別。enctype有兩個值,默認值為application/x-www-form-urlencoded,而另一個值multipart/form-data只能用於post。
2.3 提交的數據的長度

HTTP specification並沒有對URL長度進行限制,但是IE將請求的URL長度限制為2083個字符,從而限制了get提交的數據長度。測試表明如果URL超出這個限制,提交form時IE不會有任何響應。其它浏覽器則沒有URL的長度限制,因此其它浏覽器能通過get提交的數據長度僅受限於服務器的設置。

而對於post,因為提交的數據不在url中,所以通常可以簡單地認為數據長度限制僅受限於服務器的設置。
2.4 緩存

由於一個get得到的結果直接對應到一個URI,所以get的結果頁面有可能被浏覽器緩存。而post一般則不能,參考5。
2.5 引用和SEO

出於和上面相同的原因,我們可以用一個URI引用一個get的結果頁面,而post的結果則不能,所以必然不能被seo/seo.html" target="_blank">搜索引擎搜到。
3. 服務端的處理

在服務端的ASP.NET程序中,對於get,我們用Request.QueryString[control-name]來取得對應的=current-value;對於post,我們用Request.Form[control-name]。

我們也可以籠統地使用Request[control-name]。但這樣做的效率不如前者。我們可以用下面的程序比較

 代碼如下 復制代碼

Request.QueryString和Request的效率:
&lt;%@ Page Language=”C#” %&gt;

<script>// <![CDATA[
protected void Page_PreInit(object sender, EventArgs e)
{
if(Request["InputString"] != null)
{
int count = 1000000;
DateTime start;
DateTime end;
string value = “”;
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request.QueryString["InputString"];
}
end = DateTime.Now;
double requestGet = (end – start).TotalSeconds;
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request["InputString"];
}
end = DateTime.Now;
double request = (end – start).TotalSeconds;
compare.InnerHtml = requestGet.ToString() + ” / ” + request.ToString() + ” = ” + (requestGet / request).ToString();
get.InnerHtml = value;
}
}
// ]]></script>

Request.QueryString / Request

<form action=”FormGet.aspx” method=”get”>
<div><input name=”InputString” type=”text” /><input type=”submit” value=”Post” />

Get: <span id=”get”> </span>

Request.QueryString / Request: <span id=”compare”> </span></div>
</form>

同樣的辦法我們可以比較Request.Form和Request。

最後得到的結果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多數時候是小於1的。因此,我們因該盡量用Request.QueryString或 Request.Form來代替Request。
4. 正確地使用get和post

W3C的官方建議是:當且僅當form是冪等(idempotent)的時候,使用get。冪等是一個數學上的術語,其定義是:對於一個函數f : D -&gt; D,如果D中的所有x滿足f (f x) = f x,那麼這個函數是冪等的。HTTP specification(比如RFC 2616)中,將冪等解釋為:多次相同請求產生的副作用,和一次請求的副作用相同。

打個比方,如果你提交一個form會從Google上查詢一個關鍵詞,那麼我們可以認為這個form是冪等的,因為1次提交和10次提交的副作用是差不多的(10次查詢可能會多消耗一些電能);如果你提交一個form是訂購一個終極大黃蜂(Utimate bumblebee),那麼這就不是冪等的:要是你不小心多提交了1次form的話,你可能會被老婆亂罵,你不小心又提交了10次的話,你可能就破產了——一次提交和多次提交的副作用明顯不同,所以這不是冪等的。

所以,一般來說,如果提交這個請求純粹只是從服務端獲取數據而不進行其他操作,並且多次提交不會有明顯的副作用,應該使用get。比如:

* 搜索引擎的查詢:http://www.google.com/search?q=yandixin;
* 分頁:ArticleList.asp?Page=1。

如果提交這個請求會產生其它操作和影響,就應該使用post。比如:

* 修改服務器上數據庫中的數據;
* 發送一封郵件;
* 刪除一個文件。

另一個要考慮的因素是安全性。見2.1。
5. 浏覽器差異

* IE 6:URL長度限制為2083個字符;post之後,刷新頁面不會自動重新post數據,會出現警告;

並且,在後退的過程中有可能出現“Page has Expired”(通常是向自己post,然後後退時):

微軟的技術支持人員號稱“this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser”,並且說“You can also inform your users of this”,實在是荒唐。另外,一篇KB也提到這個問題,說將Response.CacheControl設為”Public”即可,經測試僅在第一次後退時有效。
* IE 7:和IE 6相同;
* Firefox 2.0.0.11:刷新頁面不會自動重新post數據,會出現警告;
* Opera 9.24:正常(自動post數據);
* Safari 3.0.4:post之後,刷新頁面、前進、後退都不會自動重新post數據,會出現警告。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved