php表单提交数据之get,post实例详解

本文章来给大家介绍一个入门教程关于php表单提交数据之get,post实例,有需要了解的同学可进入参考参考。

1.什么是表单

所谓表单,说简单点就是一对form标签。即: 。

2.表单的作用

表单的作用是采集客户端提交的数据,并把数据提交给服务端。

比如在登录一个网站时,你需要输入自己的用户名和密码才能登陆。又比如你注册游戏账号时,你需要填写自己的邮箱、密码、年龄等等。

这些操作就要通过表单提交给服务器,最后由服务器记录在数据库。(不是所有)
3.表单的组成

表单的两个标签必须是成对出现的:。

form标签有两个必填的属性 : action,method。

action的作用是指定要提交到服务器的地址,比如我要提交到本站的info.php文件,那么就写成

,本站的文件写相对路径就可以了:

method属性,顾名思义就是提交数据的方法,它有两个值可选:post/get ,post是隐藏传递,get是地址栏传递。具体不同请参阅文章《form的get和post 详细分析区别》。

如果用get传递,以上就可以写成:

form标签中可以添加文本框,比如用户填写用户名和密码的:

用户名:

也可以多行文本textarea等:

最后加一个提交按钮和一个重置按钮:

细心的童鞋可以看出,以上的几个标签除了提交、重置和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文件,内容:

代码如下

用户名:

再创建info.php文件,内容:

代码如下

友情提示:以上所有引号和分号均为英文状态下的引号和分号,中文的话会报错滴!!如有中文引号请自行修改 ^^

理解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在提交的时候,会产生这样能够一个get请求:formget.aspx?productid=1。

而post会把form的数据集,即productid=1这个键值对包装在请求的body中,发送给服务器,然后向服务器请求数据。对于:

这样一个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的效率:

《script》//
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

get:

request.querystring / request:

同样的办法我们可以比较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 -> 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数据,会出现警告。

http://www.bkjia.com/phpjc/628746.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/628746.htmltecharticle本文章来给大家介绍一个入门教程关于php表单提交数据之get,post实例,有需要了解的同学可进入参考参考。 1.什么是表单 所谓表单,说简单…

Posted in 未分类

发表评论