结合PHP使用HTML表单

  能较容易地对用户通过 HTML 表单提交的信息进行操作的能力一直是PHP的优势之一。事实上,PHP 版本4.1添加了几个访问该信息的新方法并有效地除去了以前版本中最常用的一个方法。本文研究了使用 HTML 表单上提交的信息的不同方法,并同时使用了 PHP 较早的版本和较新的版本。本文首先从研究单个值开始,然后构建可以一般性地访问任何可用的表单值的页面。

注:本文假定您对运行 PHP 版本 3.0 或更高版本的 Web 服务器具有访问权。您需要对 PHP 本身以及创建 HTML 表单有基本了解。

HTML 表单

在阅读本文的过程中,您将看到不同类型的 HTML 表单元素如何提供 PHP 能够访问的信息。针对本示例,我使用了一个简单的信息表单,它由两个文本域、两个复选框和一个允许多项的选择框组成:

清单 1. HTML 表单

<html>

<head><title>Tour Information</title></head>

<body>

<h2>Mission Information</h2>

<form action="formaction.php">

<table width="100%">

<tr><td>Ship Name:</td><td><input type="text" name="ship" /></td></tr>

<tr><td>Trip Date:</td><td><input type="text" name="tripdate" /></td></tr>

<tr><td colspan="2">Mission Goals:</td></tr>

<tr>

<td><input type="checkbox" name="exploration" value="yes" />

Exploration</td>

<td><input type="checkbox" name="contact" value="yes" />

Contact</td>

</tr>

<tr>

<td valign="top">Crew species: </td>

<td>

<select name="crew" multiple="multiple">

<option value="xebrax">Xebrax</option>

<option value="snertal">Snertal</option>

<option value="gosny">Gosny</option>

</select>

</td>

</tr>

<tr><td colspan="2" align="center"><input type="submit" /></td></tr>

</table>

</form>

</body>

</html>

在没有指定方法的情况下,该表单使用缺省方法 GET,浏览器用它将表单值附加到 URL,如下所示:

http://www.vanguardreport.com/formaction.php?

ship=Midnight+Runner&tripdate=12-15-2433&exploration=yes&crew=snertal&crew=gosny

图 1 显示表单本身。

图 1. HTML 表单

老办法:访问全局变量

清单 2 中显示的代码将表单值作为全局变量处理:

清单 2. 作为全局变量的表单值

<?php

echo "Ship = ".$ship;

echo "<br />";

echo "Tripdate = ".$tripdate;

echo "<br />";

echo "Exploration = ".$exploration;

echo "<br />";

echo "Contact = ".$contact;

?>

生成的 Web 页面显示提交的值:

Ship = Midnight Runner

Tripdate = 12-15-2433

Exploration = yes

Contact =

(正如您稍后将看到的那样,Contact 没有值,因为没有选中那个框)。

清单 2 中的表示法当然是方便的,但它仅在 PHP 伪指令 register_globals 被设置为 on 时才可用。在版本 4.2 以前,这是缺省设置,许多 PHP 开发人员甚至没有意识到有这样的问题。然而,从版本 4.2 开始,register_globals 的缺省设置是 off,在此情况下,该表示法不能正常工作,因为不再用适当的值创建并初始化变量。

然而,您可以用其它的方法初始化这些变量。第一个方法是更改 register_globals 的值。许多使用共享服务器的开发人员无权为整个服务器更改该值,但可以针对某个特定站点改变行为。如您有 .htaccess 文件的访问权,您可以通过添加以下伪指令启用 register_globals:

php_flag register_globals on

鉴于对该特性是否可用的不确定性,建议开发人员最好不要使用或依靠这种获取变量的方法。那么您有什么选择呢?

如果您的系统运行的是版本 4.1 或更高版本,则您的另一个选择是使用 import_request_variables() 有选择地注册全局变量集合。您可以使用该函数导入 get、post 和 cookie 值,而且如果您愿意的话,还可以给每项添加前缀。例如:

<?php

import_request_variables(gp, "formval_");

echo "Ship = ".$formval_ship;

echo "<br />";

echo "Tripdate = ".$formval_tripdate;

echo "<br />";

echo "Exploration = ".$formval_exploration;

echo "<br />";

echo "Contact = ".$formval_contact;

?>

这里,导入了 get 和 post 值 — 使用 c 来导入 cookie 值 — 而且由于 p 跟在 g 之后,所以 post 值将覆盖同名的 get 值。

但如果您象许多开发人员一样没有运行版本 4.1 或更高版本,那怎么办呢?

访问表单值集合

对于那些运行较早版本或不愿使用全局变量的人来说,可以选择使用 $HTTP_GET_VARS 和 $HTTP_POST_VARS 数组。尽管并不赞成使用这些集合,但它们仍然可用,而且仍被广泛使用。当真的不再使用它们时,将用版本 4.1 中添加的 $_GET 和 $_POST 数组替代它们。

这两类数组的类型都是散列表(hash table)。散列表是通过字符串值而不是整数来建立索引的数组。使用表单时,可以通过值的名称来访问值,如清单 3 所示:

清单 3. 通过散列表访问表单值

<?

$ship_value = $HTTP_GET_VARS['ship'];

echo $ship_value;

echo "<br />";

$tripdate_value = $HTTP_GET_VARS['tripdate'];

echo $tripdate_value;

echo "<br />";

$exploration_value= $HTTP_GET_VARS['exploration'];

echo $exploration_value;

echo "<br />";

$contact_value = $HTTP_GET_VARS['contact'];

echo $contact_value;

?>

使用该方法,您可以通过名称来检索每个字段的值。

单名,多值
到现在为止,每个名称仅对应一个值。如果有多个值会怎样?例如,crew species 列表框允许用名称 crew 提交多个值。

理想情况下,您希望将这些值作为数组使用,这样就可以显式地检索它们。要实现这一点,您必须对 HTML 页面稍加改动。要作为数组提交的字段应该用方括号命名,如 crew[] 中:

清单 4. 修改 HTML 页面

...

<td>

<select name="crew[]" multiple="multiple">

<option value="xebrax">Xebrax</option>

<option value="snertal">Snertal</option>

<option value="gosny">Gosny</option>

</select>

</td>

...
一旦您作出更改,检索表单值实际上产生数组:

 

清单 5. 将变量作为数组访问

...

$crew_values = $HTTP_GET_VARS['crew'];

echo "0) ".$crew_values[0];

echo "<br />";

echo "1) ".$crew_values[1];

echo "<br />";

echo "2) ".$crew_values[2];

...

现在,提交页面后会显示多个值:

0) snertal

1) gosny

2)
首先要注意这是一个下标从 0 开始的数组。第一个遇到的值在位置 0 中,接下来的值在位置 1,以此类推。在本例中,我只提交了两个值,所以第三项为空。

通常,您不知道将提交多少项,因此您可以利用它是数组这一事实使用 sizeof() 函数来确定提交了多少值,而不必直接调用每一项:

清单 6. 确定数组的大小

...

for ($i = 0; $i < sizeof($crew_values); $i++) {

echo $crew_values[$i];

echo "<br />";

}

...
然而,有时问题不是值太多,而是根本没有

时间: 2024-09-12 05:11:35

结合PHP使用HTML表单的相关文章

WEB表单设计

设计师不再只是为互联网创造漂亮美观的图形那么简单了,作为一个WEB设计师,我们还需要考虑一些其他的问题,比如用户体验,算法,代码等等.如今用户体验设计越来越重要,对于WEB表单的设计尤其如此. WEB表单设计的目标是设计出一套让用户能够从填表到点击提交按钮的最简单的流程.这个过程中不需要太多的炫目效果,虽然jQuery的表单插件一直都很受欢迎.在这片文章中我们只关注于表单的用户体验和交互过程.这里的概念也能够有效的帮助你减少用户在填表过程中的挫折感. 保持醒目和简洁 我听过不计其数的用户抱怨注册

在ASP中使用SQL语句之9:表单操作

语句 从某个页面表单中取出信息是ASP编程中常见的问题.但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小.简单的GUI界面都可能令循环遍历操作耗费太多的时间. 比方说,假设有个团队成员登录到GUI屏幕输入自己的名字姓氏和名字之间用点号连接:amy.cowen.这个值通过表单提交,她的当前项目列表就从数据库中取了出来并显示在屏幕上.为了快速地取出用户的记录以便显示在屏幕上,你可以编写以下代码. 假设HTML页面上包含以下代码:<FORM ACTION="login_post

《PHP编程最快明白》第四讲:日期、表单接收、session、cookie

实例11:日期戳.日期显示 复制代码 代码如下: <?php echo time();//返回一串以秒计算的时间数字戳 echo "<br>"; echo date("Y-m-d H:i:s",time()+8*3600);//格式化时间,+8*3600变为中国时区时间 echo "<br>"; $str="2010-08-24 10:26:10"; echo date("Y-m-d H

表单-多表头和可变表头(一条信息的数据量大小可变。)该怎么设计数据库的表结构。

问题描述 多表头和可变表头(一条信息的数据量大小可变.)该怎么设计数据库的表结构. 我现在有一个表单需要存入数据库.但是客户要求该表单的 表头可变.也就是他要自定义表单.这种情况我该怎么为这张表单设计表结构了?同时该表单中的所有字段都要参加计算的,有些项的值是其他项通过计算得出的.虽然是简单的加减乘除,但是客户要求可以自动的计算.小弟用的Spring MVC+JPA 数据库mysql 或者 oracle 解决方案 一般一个表单中的字段分为固定的字段和 动态的字段. 将固定的字段,设计成一张表,称

聊聊打造优质WEB表单的9个方法

  这篇文章算是笔者交的一份读书笔记,与 CRM 系统打交道了这么久,表单天天见.如果表单有感情的话,我猜它应该都不想再看见我了.也是有缘,老板推荐了一本表单设计的书--<Web Form Design – Filling the blanks>by Luke Wroblewski,得此书如获至宝.该书对表单描述详尽,案例充分,解决了许多笔者多年未解决的问题.接下来进入正题,我们来聊一聊如何打造优质 Web 表单.黑喂狗! 1. 标签推荐使用右对齐方式 (图示1:淘宝网注册页面) 马泰奥·彭佐

用了城市级联插件,表单序列化后选择的城市变成乱码

问题描述 用了城市级联插件,表单序列化后选择的城市变成乱码 明明选择是北京,但是序列化后变成了如下所示 province=%E5%8C%97%E4%BA%AC%E5%B8%82&city=%E6%98%8C%E5%B9%B3%E5%8C%B 求指点 解决方案 这个是中文的编码,不是乱码..你的内容不止北京这2个字而已吧,北京对应的编码应该是%E5%8C%97%E4%BA%AC,你的多了一个字了. document.write(encodeURIComponent('北京')); 你服务器正确获取

Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法。

问题描述 Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法. 关键代码如下: ${Msg.sendUser.username } 上面代码的意思是:把${Msg.sendUser}提交到action,赋值给 action类属性message的sendUser.(sendUser数据类型是User对象) 请求后提示找不到action中的自定义方法,但是我表单中的值换成下面 的,变成赋值给message的属性sendUser的属性username,就能成功. 是

Ajax表单提交实例

ajax|表单提交 昨天在CSDN逛的时候,看见一位网友需要解决一些关于AJAX的FORM提交的问题,现在把一个实例贴出来,希望对广大爱好者有帮助. <!--注册模块-->default.asp <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><

JSP动态网页入门:表单输入例子

js|动态|网页 我们将创建一个Web页面,它有一个输入表单,用户可以输入一个股票代号以获得出当前股票价格(有20分钟延迟).如果输入有误,则显示错误提示页面. quote.jsp 首先,用以下代码创建quote.jsp页面并将其保存在JSWDK安装目录下的Web 目录中.大多数的页面是含JSP代码的标准HTML.第六行是一个页面指令,表明将把所有错误发送到"errorPage.jsp"文中.第13到15行是一个脚本段,主要说明仅当有"symbol"参数时才显示表格

一种表单重复提交处理方法

表单重复提交处理: 1. 在生成表单时执行如下:    session.setAttribute("forum_add", "forum_add"); 2. 提交处理时作如下判断         if (isRedo(request, "forum_add")) {            //提示重复提交,作相关处理        } 相关函数:     /**     * 判断是否为重复提交     * 1,检查Session中是否含有指定名字