第5章 Web交互编程 Web 应用程序的基本功能是与用户进行交互,获取并处理用户提交的数据。用户提 交数据的方法有 : ① 通过表单提交,如用户注册、用户登录、留言等都是通过表单提交信 息 ; ② 使用网址中的URL 参数发送数据给服务器。这些数据都是以HTTP 请求的方式 发送。Web 服务器必须能够获取用户通过浏览器发送来的数据,才能与用户进行交互。 5.1 接收浏览器数据 浏览器可以通过表单或URL 字符串向服务器发送数据,这些数据称为HTTP 请求信 息。PHP 提供了很多预定义的超全局变量,见表5.1,用来获取HTTP 请求信息,这些超全 局变量的数据类型均为数组。 表5.1 PHP的超全局变量及功能 超全局变量 $ _POST $ _GET $ _REQUEST $ _SERVER $ _SESSION $ _COOKIE $ _FILE $ _ENV 功 能 获取客户端以POST 方式发送的HTTP 请求信息 获取客户端以GET 方式发送的HTTP 请求信息 包含 $ _GET 、 $ _POST 和 $ _COOKIE 3 类数组中的信息 获取HTTP 请求中的环境变量信息 存储和读取为单个用户保存的信息 读取用户的Cookie 信息 获取通过POST 方式上传文件时的相关信息,为多维数组 获取服务器名称或系统shell 等与服务器相关的信息 说明 : 超全局变量表示该变量在一个文件的所有区域中都可使用,包括自定义函数内部。 5.1.1 使用 $ _POST[ ] 获取表单数据 用户在表单中输入数据后,可以单击“提交”按钮,将数据提交给服务器,由在服务器 端工作的PHP 程序接收和处理这些表单数据。 119 表单提交数据的方式分为GET 和POST 两种,在定义表单时,将method 属性设置为 GET 或不设置时,都会采用GET 方式提交;将method 属性设置为POST 时,则会采用 POST 方式提交。 使用GET 方式提交数据时,表单数据将通过URL 参数的形式发送给服务器,而使用 POST 方式时,数据不会出现在URL 参数中。 在PHP 中, $ _POST 数组用来获取使用POST 方式提交的表单数据,语法如下: 变量名= $ _POST["表单元素name 属性值"] 表示将获取的某个表单元素值(如一个文本框中的内容)保存到一个服务器端变量 中。例如, $ user = $ _POST[" user" ],其中$ user 是自定义的一个变量名称,而后面的 user 则是一个表单元素的名称(name 属性值),两者不是一回事。 在实际应用中,表单的HTML 代码和获取表单数据的PHP 程序既可以分别写在两个 文件中,也可以写在同一个文件中。 1. 使用两个网页文件 下面的例子用来获取用户登录时输入的用户名和密码。它使用了两张网页,其 中5.1.php 用来显示表单,是一个纯HTML 页面,5.2. php 用来接收并输出获取的表单 数据。 .....................清单5.1.php...........................................
.....................清单5.2.php........................................... $ userName= $ _POST["userName"]; $ PS= $ _POST["PS"]; echo "您输入的用户名是:". $ userName; echo "您选择了". $ hobbynum."项爱好:
" ; for( $ i=0; $ i< $ hobbynum; $ i++) //通过循环输出复选框的值 echo $ hobby[ $ i].''; echo "这是第一条新闻
"; elseif ( $ id= =2) echo "这是第二条新闻
"; elseif ( $ id= =3) echo "这是第三条新闻
"; else echo "参数非法
"; ?> 获取URL 变量 126 图5.7 单击5.8.php 中的第二个超链接 图5.8 5.9.php 的运行结果 说明: ① 5.8.php 中的所有链接都链接到同一网页,只是设置了不同的URL 变量值,就可 以使5.9.php 根据不同链接传来的不同id 值显示对应的网页内容,实现了动态新闻网页 效果。 ② URL 变量中的数据都是字符串类型的值,因此,如果要对数值进行判断,最好先 转换为数值型,这样可防止非法用户手工在URL 后注入非法参数。 例5.2 在<form>标记的action 属性中设置URL 字符串。运行结果如图5.9 所示。.....................清单5.10.php........................................... $ flag= $ _GET["flag"]; //获取url 变量flag 的值 if ( $ flag= ='1') echo '欢迎'. $ _POST['user']. '光临! '; else //没有单击"提交"按钮时 echo ''; ?> 图5.9 5.10.php 的运行结果 说明: 在<form>标记中,“action = " ?flag = 1" ”省略了文件名表示将表单提交给自身, 设置查询字符串flag = 1 用来判断用户是否单击了“提交”按钮,一旦单击了,则URL 地址 后会增加" ?flag = 1" ,因此可据此输出不同的内容。 3. 设置URL 字符串的方法总结 如果要设置URL 字符串,以便将URL 字符串中的信息传递给相应网页,有以下3 种 方法。 ① 在超链接的href 属性值中的URL 后添加URL 字符串; ② 在表单的action 属性值中的URL 后添加URL 字符串; 127 ③ 直接在浏览器地址栏中的网页URL 后手工输入URL 字符串。 显然,普通用户不会使用第③种方法设置URL 字符串,因此一般使用方法①或②诱 导用户将URL 变量传递给相关网页。 提示 : 表单如果设置为GET 方式提交,那么表单中的数据将转换成URL 字符串发 送给服务器。此时若在表单的action 属性值中也设置URL 字符串,那么将发生冲突, action 属性值中的URL 字符串将无效。因此,如果在action 属性值中有URL 字符串,则 表单只能用POST 方式提交,5.10.php 就是一个例子。 5.1.4 发送HTTP 请求的基本方法 浏览器向服务器发送HTTP 请求有两种方法 : 一种方法是在地址栏输入网址并回 车,这样将以GET 方式向服务器发送一个HTTP 请求;另一种方法是提交表单,如果设置 form 标记的method 属性为get,那么表单中的数据将以GET 方式发送给服务器;如果设 置form 标记的method 属性为post,那么数据将以POST 方式发送。对于GET 方式的 HTTP 请求,服务器端只有使用$_GET[ ] 才能获取其中的数据,而对于POST 方式的 HTTP 请求,服务器端只有使用$_POST[ ] 才能获取其中的数据,见表5. 2 。 表5.2 浏览器发送请求与服务器获取请求的方法 发送HTTP 请求发送请求的方式服务器获取请求的方法 输入网址(URL) GET 方式 $ _GET[ ] 提交表单 method = " get" method = " post" POST 方式 $ _POST[ ] 一个HTTP 请求实际上是一个数据包,如果以提交表单形式发送HTTP 请求,则这个 数据包中含有表单数据,如果是GET 方式发送的请求,则包含了URL 字符串中的数据。 以5.1.php 和5.2.php 的执行过程为例,我们可以把浏览器发送的HTTP 请求数据包 想象成一辆卡车,它装载了用户在表单中填写的信息。当单击“提交 ” 按钮后,就会发送 HTTP 请求给服务器。这就好比这辆卡车载着货物(表单中的信息)从浏览器行驶到了服 务器。服务器此时可以使用 $ _POST[ ] 卸下卡车上的货物,保存到服务器端的变量中。 整个过程如图5.10 所示。 图5.10 浏览器发送HTTP 请求和服务器获取HTTP 请求内容的示意图