作为一个计算机系统,输入输出设备作为非核心设备却是不可或缺的,硬件如此,软件亦是如此。试想一台功能强劲的计算机,如果没有输入输出设备,它与一块只能耗电并且发出嗡嗡噪音的废铁有何不同。应用程序的道理也是一样。

在PHP开发的WEB应用程序中,所有非PHP代码以及输出语句中的内容都会被输出,那么程序又是如何接收输入内容的呢?相信不少人一定想到了 WEB表单!在HTTP协议下,输入输出的原型其实是HTTP请求与响应,客户端向服务器端发送的数据称之为请求,反之称为响应。虽然HTTP/1.1定义了7种请求方法,但真正常用的却只有在HTTP/0.9种就已经有的两种方法——GET和POST,它们都允许发送自定义数据给服务器端。因此,可以通过接收这两种方法的请求数据,来实现输入。

一、 $_GET数组
GET是HTTP中最原始的请求方式,在网页中点击一个超级链接或在地址栏输入一个URL都会发送一个GET请求。在GET请求中,数据是后缀在URL后面来发送的,就好像这样: [url]http://www.phpboke.com/request.php?id=root&password=asdfl[/url]。PHP将GET请求封装在了$_GET数组中,请求的变量名是数组的下标,要接收上面那个请求传递的两个变量id和password,使用$_GET['id'] 和$_GET['password']即可。请看下面的例子:

<!– get.php文件 –>
<?php
if($_GET['get']) {
echo $_GET['id'], “<BR>”;
echo $_GET['password'], “<BR>”;
}
?>
<form action=”get.php”>
<label for=”id”>账号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”get” value=”提交”>
</form>

get.php文件中有一个表单,它将使用默认的GET方法发送请求,其效果与上面看到的URL是相同的。请注意文件一开始的PHP代码段:它首先判断请求变量get是否存在(是否点击了name属性为get的提交按钮),如果存在则输出请求的变量。由于在第一次打开文件时,变量get不存在,因此开头的PHP代码根本不会被执行,而直接输出表单。当提交表单后,PHP代码得到执行,用户输入的两个变量也会被输出。

有时候,在程序中并不能确定客户端提交了哪些数据过来,那么怎么样在不知道请求变量名字的前提下遍历请求数据呢?这种屏蔽细节,遍历集合的方法在《设计模式》中被称为迭代(Iterate), PHP中是通过foreach语句来实现的。请看下面的例子:

<!– iterator.php –>
<?php
foreach($_GET as $index => $value) echo “$_GET[$index] = $value”, “<BR>”;
?>
使用iterator.php?id=juxugongzi &password=adsl&address=peking这个链接访问它,将会看到foreach语句将所有用GET方法请求的变量都枚举出来了,而在事先,我们并不知道每个请求变量的名字。

二、 $_POST数组
GET方法的本意就是下载(与其对应的是上传方法PUT),因此并不是专门用于传递数据的,它将请求数据全部经过URL编码后缀在请求资源的后面,这样一来,当数据很多时URL就会变得很长——但这并不是问题的所在,问题所在是一些WEB浏览器或服务器程序会限制这行字符串的长度。这时,就需要用到 POST方法了。
顾名思义,POST方法的主要用途就是“传递”数据,它将数据放在所有请求标题的后面上传,这样一来,无论有多少数据上传都不成问题了(这样请求数据的大小之取决于WEB服务允许的尺寸了)。通常来说,对于表单数据如无特别需要都使用POST方法来上传,这样就无须去关心具体上传数据的尺寸了。
POST方法的请求数据被封装到了$_POST数组中,其使用方法与$_GET数组一样。将上面的表单添加一个method属性,就变成了这样:

<!– post.php文件 –>
<?php
if($_POST['post']) {
foreach($_POST as $index = > $value) echo “$_POST[$index] = $value”, “<BR>”;
}
?>
<form action=”post.php” method=”post”>
<label for=”id”>账号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”post” value=”提交”>
</form>

另一个有趣的设定是,GET方法和POST方法并不矛盾,在POST方法中同样可以传递GET变量,将上面的post.php文件稍微改动一下,就成了这样:

<!– post.php文件 –>
<?php
if($_POST['post']) {
foreach($_POST as $index = > $value) echo “$_POST[$index] = $value”, “<BR>”;
foreach($_GET as $index = > $value) echo “$_GET[$index] = $value”, “<BR>”;
}
?>
<form action=”post.php?act=login” method=”post”>
<label for=”id”>帐号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”post” value=”提交”>
</form>

该程序同时处理了GET方法(act 参数)和POST方法(id 和 password 参数)的请求数据,GET方法的请求变量后缀在了表单action属性值的后面,这样只有一点问题,就是GET方法的请求变量不能由用户来输入。通常,固定的数据使用GET方法,由用户输入的数据使用POST方法来发送,两种方法区分开了不同逻辑的数据。不过读者在构建这种表单的时候,一定要注意两种方法不要有相同的变量名,否则将出现不可预料的后果。最后,需要注意的是,当使用GET方法发送数据时,则 <form>标签 action 属性值中不能包含查询字符串(即使包含也不会生效),所以,下面的表单中,act 参数将不能发送:

<form action=”post.php?act=login” method=”get”>
<label for=”id”>账号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”post” value=”提交”>
</form>

应该改成下面的形式:

<form action=”post.php” method=”get”>
<label for=”id”>账号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”post” value=”提交”>
<input type=”hidden” name=”act” value=”login”>
</form>

三、$_REQUEST数组
使用$_GET和$_POST接收传递来的数据有一个问题,就是程序必须知道上传来的数据具体使用哪种方法。但实际上,无论是哪种方法,都是传递数据给 WEB应用程序,它们的目的是一样的。$_REQUEST数组屏蔽了这些细节,它封装了$_GET、$_POST、$_FILE和$_COOKIE四个数组的内容,使我们对这些数据可以一视同仁。事实上,在JSP中,GET和POST的变量就是统一使用request.getParameter()方法来接收,只不过PHP中的$_REQUEST数组又封装了Cookie的内容。当使用$_REQUEST数组后,上面的例子可以简化成这样:

<!– request.php文件 –>
<?php
if($_REQUEST['post']) {
foreach($_REQUEST as $index = > $value) echo “$_REQUEST[$index] = $value”, “<BR>”;
}
?>
<form action=”request.php?id=juxugongzi&password=adsl” method=”post”>
<label for=”id”>账号:</label><input type=”text” name=”id”>
<label for=”password”>密码:</label><input type=”text” name=”password”>
<input type=”submit” name=”post” value=”提交”>
</form>

不过,使用$_REQUEST数组是一定要注意,几种数据中的变量名不要冲突,尤其要注意的是$_COOKIE,它的数据不使用过客户端来设置的。

转自:http://hi.baidu.com/flaystudio/item/04cd57ae5c7ead30020a4d0d

PHP中Get()和Post()用法详解的更多相关文章

  1. SVN中tag branch trunk用法详解

    SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag bran ...

  2. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  3. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  4. .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下   在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...

  5. ubuntu中rar与unrar用法详解

    本文转载:http://helloklzs.iteye.com/blog/1139993 安装: sudo apt-get install rar 这样就可以安装了 删除是以下语句 sudo apt- ...

  6. Javascript中的this关键字用法详解

    在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例. 而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混 ...

  7. Python中scatter函数参数用法详解

    1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如下: 4.基本的使用方法如下: #导入必要的模块 import numpy as np import matp ...

  8. 编程中,static的用法详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...

  9. VC++中MessageBox的常见用法详解

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");        ...

  10. ElasticSearch中辅助API常用用法详解

    本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...

随机推荐

  1. 导入NGUI插件

    在Unity编辑器顶部菜单栏中的Assets菜单中选择Import Package,然后选择Custom Package(自定义资源包),弹出资源路径窗口,在其中找到NGUI资源包所在的位置,单击”打 ...

  2. 映像备份与恢复管理工具Easy Image X使用说明

    Easy Image X(简称EIX)是一个支持Ghost映像(.gho)和ImageX映像(.wim)的映像管理工具,具有友好的图形界面,仅需几步简单操作即可完成映像备份与恢复工作.维护时使用最多的 ...

  3. 更改nginx网站根目录

    默认网站根目录为/usr/local/nginx/html,要将它改成/homw/www vi /usr/local/nginx/conf/nginx.conf 将其中的           loca ...

  4. BZOJ 3982 Stacking Plates 解题报告

    我们首先可以得到:如果有一堆盘子里有一些相邻的盘子的直径相等,那么自然这些盘子可以统一处理,就可以缩成一个了. 然后我们接着考虑给每一堆盘子都染上一种颜色,那么操作的次数 step = diff * ...

  5. jquery prop and attr

    http://www.javascript100.com/?p=877 http://blog.sina.com.cn/s/blog_655388ed01017cnc.html http://www. ...

  6. SQL中Case的使用方法(下篇)(转)

    接上篇 四,根据条件有选择的UPDATE. 例,有如下更新条件 工资5000以上的职员,工资减少10% 工资在2000到4600之间的职员,工资增加15% 很容易考虑的是选择执行两次UPDATE语句, ...

  7. [dp]POJ2559 && HDOJ1506 Largest Rectangle in a Histogram

    题意 给n个条形的高度, 问能放的最大矩形面积 分析: 从左到右 从右到左 各搞一遍 分别记录      L[i]记录列(从前往后)标 第几列开始 可以往后放高度为a[i]的矩形  R[i]记录列(从 ...

  8. [topcoder]BusinessTasks

    水题,不值一提.http://community.topcoder.com/stat?c=problem_statement&pm=1585&rd=6535 import java.u ...

  9. [wikioi]二叉树最大宽度和高度

    简单的DFS,用数组w记录每一层的宽度就行了,就是遇到一层就++.中间发现在C++里面,如果int未初始化就是用也是有异常的.还有二叉树的数组表示时,从1开始计数会比较好.还有后来学会了数组这样的初始 ...

  10. Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

    近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...