能较容易地对用户通过 HTML 表单提交的信息进行操作的能力一直是 PHP 的优势之一。事实上,PHP 版本 4.1 添加了几个访问该信息的新方法并有效地除去了以前版本中最常用的一个方法。本文研究了使用 HTML 表单上提交的信息的不同方法,并同时使用了 PHP 较早的版本和较新的版本。本文首先从研究单个值开始,然后构建可以一般性地访问任何可用的表单值的页面。
注:本文假定您对运行 PHP 版本 3.0 或更高版本的 Web 服务器具有访问权。您需要对 PHP 本身以及创建 HTML 表单有基本了解。
HTML 表单
在阅读本文的过程中,您将看到不同类型的 HTML 表单元素如何提供 PHP 能够访问的信息。针对本示例,我使用了一个简单的信息表单,它由两个文本域、两个复选框和一个允许多项的选择框组成:
清单 1. HTML 表单
Mission Information
在没有指定方法的情况下,该表单使用缺省方法 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. 作为全局变量的表单值
echo "Ship = ".$ship;
echo "
";
echo "Tripdate = ".$tripdate;
echo "
";
echo "Exploration = ".$exploration;
echo "
";
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 值,而且如果您愿意的话,还可以给每项添加前缀。例如:
import_request_variables(gp, "formval_");
echo "Ship = ".$formval_ship;
echo "
";
echo "Tripdate = ".$formval_tripdate;
echo "
";
echo "Exploration = ".$formval_exploration;
echo "
";
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 "
";
$tripdate_value = $HTTP_GET_VARS['tripdate'];
echo $tripdate_value;
echo "
";
$exploration_value= $HTTP_GET_VARS['exploration'];
echo $exploration_value;
echo "
";
$contact_value = $HTTP_GET_VARS['contact'];
echo $contact_value;
?>
使用该方法,您可以通过名称来检索每个字段的值。
单名,多值
到现在为止,每个名称仅对应一个值。如果有多个值会怎样?例如,crew species 列表框允许用名称 crew 提交多个值。
理想情况下,您希望将这些值作为数组使用,这样就可以显式地检索它们。要实现这一点,您必须对 HTML 页面稍加改动。要作为数组提交的字段应该用方括号命名,如 crew[] 中:
清单 4. 修改 HTML 页面
...
...
一旦您作出更改,检索表单值实际上产生数组:
清单 5. 将变量作为数组访问
...
$crew_values = $HTTP_GET_VARS['crew'];
echo "0) ".$crew_values[0];
echo "
";
echo "1) ".$crew_values[1];
echo "
";
echo "2) ".$crew_values[2];
...
现在,提交页面后会显示多个值:
0) snertal
1) gosny
2)
首先要注意这是一个下标从 0 开始的数组。第一个遇到的值在位置 0 中,接下来的值在位置 1,以此类推。在本例中,我只提交了两个值,所以第三项为空。
通常,您不知道将提交多少项,因此您可以利用它是数组这一事实使用 sizeof() 函数来确定提交了多少值,而不必直接调用每一项:
清单 6. 确定数组的大小
...
for ($i = 0; $i echo $crew_values[$i];
echo "
";
}
...
然而,有时问题不是值太多,而是根本没有值。
令人惊奇的消失的复选框
复选框只有实际被选中时才被提交,认识到这一点很重要。否则,它的消失将告诉您所需知道的实情:用户没有单击复选框。使用复选框时,您可以使用 isset() 函数显式地检查是否设置了值:
清单 7. 检查是否提交了复选框
...
$contact_value = $HTTP_GET_VARS['contact'];
echo $contact_value;
if (isset($contact_value)) {
//The checkbox was clicked
} else {
//The checkbox wasn't clicked
}
...
获取所有表单值
复选框字段只是您对预期表单值名称可能不完全有把握的情形的示例之一。通常,您会发现有一个以通用方法访问所有表单值的例程是很有用的。
幸运的是,因为 $HTTP_GET_VARS 及其同类只是散列表,您可以用数组的一些特性来操作它们。例如,您可以使用 array_keys() 函数来获取所有潜在值名称的列表:
清单 8. 获取表单值名称的列表
...
$form_fields = array_keys($HTTP_GET_VARS);
for ($i = 0; $i
$thisField = $form_fields[$i];
$thisValue = $HTTP_GET_VARS[$thisField];
echo $thisField ." = ". $thisValue;
echo "
";
}
...
在本例中,您实际上结合了几种技术。首先,检索表单字段名称的数组并将其命名为 $form_fields。$form_fields 数组只是一个典型的数组,因此您可以使用 sizeof() 函数来确定潜在键的数目,并对每一项进行循环遍历。对于每一项,检索字段的名称然后使用该名称获取实际值。生成的 Web 页面看起来如下:
ship = Midnight Runner
tripdate = 12-15-2433
exploration = yes
crew = Array
这里有两个重要事项。第一,contact 字段根本没有返回值,这正如预期的那样。第二,crew 值(顺便说一下,您或许知道:它的名称是 crew 而不是 crew[])是一个数组而不是值。为了实际检索所有值,需要使用 is_array() 函数检测所有数组并相应地处理它们:
清单 9. 处理数组
...
for ($i = 0; $i
$thisField = $form_fields[$i];
$thisValue = $HTTP_GET_VARS[$thisField];
if (is_array($thisValue)){
for ($j = 0; $j echo $thisField ." = ". $thisValue[$j];
echo "
";
}
} else {
echo $thisField ." = ". $thisValue;
}
echo "
";
}
...
结果是所有已实际提交的数据:
ship = Midnight Runner
tripdate = 12-15-2433
exploration = yes
crew = snertal
crew = gosny
最后一个说明:点
既然您有了能适应您提交任何表单值的表单操作页面,您就需要抽一点时间考虑一个常常让 PHP 程序员感到意外的情形。
有些情况下,设计人员会选择使用一个图形按钮而不是提交按钮,图形按钮如图 2所示,代码如清单 10所示。
清单 10. 添加图形按钮
...
...
图 2. 表单上的图形按钮
请注意,尽管上图中只有一个图像,却有两个图形按钮(或期望的结果)。作为开发人员,您可以通过检查和值一同返回的 x 和 y 坐标知道用户单击了何处。事实上,按原样提交该表单可能会创建以如下所示结尾的 URL 和查询字符串:
...snertal&crew%5B%5D=gosny&formbutton.x=37&formbutton.y=14
请注意附加到按钮名称的 .x 和 .y。然而,如果您打算提交该页面然后查看结果,您会看到:
ship = Midnight Runner
tripdate = 12-15-2433
exploration = yes
crew = snertal
crew = gosny
formbutton_x = 37
formbutton_y = 14
请注意,点号(.)已被转换成下划线(_)。这似乎有点奇怪,但它是必要的,因为 PHP 中的变量名不能有点号,因此 $formbutton.x 会是一个非法变量名。事实上,表单名称中的任何点号 ― 不仅仅针对图像按钮 ― 都被转换成下划线。
结束语
在本文中,您看到了对用户通过 HTML 或 XHTML 表单提交的信息进行访问的几种方法。如何处理该信息取决于您使用的 PHP 版本和您是否能将表单变量作为全局变量进行访问。无论何种情况,表单值可作为数组使用,并且您可以用数组的特性来循环遍历所有可用的值。

一个JsonNode是Jackson的JSON树模型,它可以将JSON读取为JsonNode实例,并将JsonNode写入JSON。通过创建ObjectMapper实例并调用readValue()方法,我们可以使用Jackson将JSON读取为JsonNode。我们可以使用JsonNode类的get()方法访问字段、数组或嵌套对象。我们可以使用asText()方法返回有效的字符串表示,并使用JsonNode类的asInt()方法将节点的值转换为Javaint。在下面的示例中,我们可以访问Json

命名管道是一种在操作系统中相对比较低级的进程通信方式,它是一种以文件为中介的进程通信方式。在Go语言中,通过os包提供了对命名管道的支持。在本文中,我们将介绍如何在Go中使用命名管道来实现进程间通信。一、命名管道的概念命名管道是一种特殊的文件,可以被多个进程同时访问。在Linux系统中,命名管道是一种特殊的文件类型,它们存在于文件系统的某个位置上,并且可以在

在iOS17中,Apple可以更好地控制应用程序可以看到的照片内容。继续阅读,了解如何按应用管理应用访问权限。在iOS中,Apple的应用内照片选取器可让您与应用共享特定照片,而照片图库的其余部分则保持私密。应用必须请求访问您的整个照片图库,您可以选择授予应用以下访问权限:受限访问–应用程序只能看到您可以选择的图像,您可以随时在应用程序中或通过转到“设置”>“隐私和安全”>“照片”来查看所选图像。完全访问权限–App可以查看照片

我们可以使用Mutagen和Python中的eyeD3模块访问音频文件的元数据。对于视频元数据,我们可以使用电影和Python中的OpenCV库。元数据是提供有关其他数据(例如音频和视频数据)的信息的数据。音频和视频文件的元数据包括文件格式、文件分辨率、文件大小、持续时间、比特率等。通过访问这些元数据,我们可以更有效地管理媒体并分析元数据以获得一些有用的信息。在本文中,我们将了解Python提供的一些用于访问音频和视频文件元数据的库或模块。访问音频元数据一些用于访问音频文件元数据的库是-使用诱变

如何解决Tomcat部署war包后无法成功访问的困扰,需要具体代码示例Tomcat作为一个广泛使用的JavaWeb服务器,允许开发人员将自己开发的Web应用打包为war文件进行部署。然而,有时候我们可能会遇到部署war包后无法成功访问的问题,这可能是由于配置不正确或其他原因引起的。在本文中,我们将提供一些解决这个困扰的具体代码示例。一、检查Tomcat服务

在Go语言中,使用第三方库是非常方便的。许多优秀的第三方库和框架可以帮助我们快速地开发应用程序,同时也减少了我们自己编写代码的工作量。但是如何正确地使用第三方库,确保其稳定性和可靠性,是我们必须了解的一个问题。本文将从以下几个方面介绍如何使用第三方库,并结合具体例子进行讲解。一、第三方库的获取Go语言中获取第三方库有以下两种方式:1.使用goget命令首先

如何解决PHP开发中的外部资源访问和调用,需要具体代码示例在PHP开发中,我们经常会遇到需要访问和调用外部资源的情况,比如API接口、第三方库或者其他服务器资源。在处理这些外部资源时,我们需要考虑如何进行安全的访问和调用,同时保证性能和可靠性。本文将介绍几种常见的解决方案,并提供相应的代码示例。一、使用curl库进行外部资源调用curl是一个非常强大的开源库

win7修改文件提示更改权限拒绝访问如何解决?一些系统文件在进行修改的时候,常常会提示我们没有权限去进行操作。我们可以去进行文件夹权限的功能关闭,或者获取管理员权限。需要修改此类文件的用户,一起来看看接下来具体的教程分享吧。win7修改文件提示更改权限拒绝访问解决办法 1、首先选中对应文件夹,点击上方工具,选中文件夹选项。 2、进入查看选项卡。 3、取消勾选使用简单文件共享然后确定。 4、然后右键选择对应文件夹,点击属性。 5、进入安全选项卡。 6、选择图示位置,点击高级。 7


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

Dreamweaver Mac version
Visual web development tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1
Easy-to-use and free code editor

Zend Studio 13.0.1
Powerful PHP integrated development environment
