php使用html表单提交_在PHP中使用HTML表单

php使用html表单提交

注意:本文假定您有权访问运行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表单
HTML表格

旧方法:访问全局变量

清单2中显示的代码将表单值视为全局值:

清单2.表单值作为全局变量
<?php

echo "Ship = ".$ship;
echo "<br />";
echo "Tripdate = ".$tripdate;
echo "<br />";
echo "Exploration = ".$exploration;
echo "<br />";
echo "Contact = ".$contact;

?>

结果网页显示提交的值:

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()有选择地注册全局集。 您可以使用此函数导入获取,发布和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数组替换。

这两个数组都是一种称为哈希表的类型。 哈希表是一个按字符串值而不是整数索引的数组。 对于表单,可以通过名称来访问值,如清单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;
?>

您可以使用此方法按名称检索每个字段的值。

一个名字,多个值

到目前为止,每个名称仅对应一个值。 一个以上的价值会发生什么? 例如,乘员种类列表框允许使用乘员名称提交多个值。

理想情况下,您希望这些值可以作为数组使用,以便可以显式检索它们。 为此,您必须对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,第二个在位置1,依此类推。 在这种情况下,我仅提交了两个值,因此第三个位置为空白。

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

清单6.确定数组的大小
...
for ($i = 0; $i < sizeof($crew_values); $i++) {
    echo $crew_values[$i];
    echo "<br />";
}
...

但是,有时候问题不是太多的值,而是根本没有值。

惊人的消失复选框

重要的是要认识到,只有在实际选中复选框的情况下,才提交复选框。 否则,它的缺失会告诉您您需要了解什么:用户没有单击此复选框。 对于复选框,您可以显式检查以查看是否使用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 < sizeof($form_fields); $i++) {

    $thisField = $form_fields[$i];
    $thisValue = $HTTP_GET_VARS[$thisField];
    echo $thisField ." = ". $thisValue;
    echo "<br />";  

}
...

在这种情况下,您实际上结合了几种技术。 首先,检索一个表单字段名称数组,并将其命名为$form_fields$form_fields数组只是一个典型的数组,因此您可以使用sizeof()函数确定潜在键的数量,并遍历每个键。 对于每个字段,您都检索字段的名称,然后使用该名称获取实际值。 结果是一个网页,显示如下:

ship = Midnight Runner
tripdate = 12-15-2433
exploration = yes
crew = Array

请注意此处的两个重要事项。 首先,联系人字段完全没有按预期返回。 其次,乘员组值(顺便说一句,它命名为乘员组,而不是您可能期望的crew[] )是一个数组,而不是一个值。 要实际检索所有值,您需要使用is_array()函数检测任何数组并进行is_array()处理:

清单9.计算数组
...
for ($i = 0; $i < sizeof($form_fields); $i++) {

    $thisField = $form_fields[$i];
    $thisValue = $HTTP_GET_VARS[$thisField];
    if (is_array($thisValue)){
        for ($j = 0; $j < sizeof($thisValue); $j++) {
            echo $thisField ." = ". $thisValue[$j];
            echo "<br />";
        }
    } else {
        echo $thisField ." = ". $thisValue;
    }
    echo "<br />";  

}
...

结果是实际提交的所有数据:

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

最后一点:点

现在您已经有了一个表单操作页面,该页面可以适应您在表单上抛出的任何表单值,现在您需要花点时间看一下一种情况,这种情况经常使PHP程序员大吃一惊。

在某些情况下,设计人员选择使用图形按钮,而不是使用提交按钮, 如图2所示, 清单10给出了代码。

清单10.添加图像按钮
...
        <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="image" src="button.gif" name="formbutton"/>
           </td>
        </tr>
    </table>
...
图2.表单上的图形按钮
添加图形按钮

请注意,尽管只有一幅图像,但是图形中有两个按钮或所需的结果。 作为开发人员,您可以通过检查随值返回的x和y坐标来判断用户单击的位置。 实际上,按原样提交表单可能会创建一个URL和querystring结尾:

...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版本以及是否可以将表单变量作为全局变量访问。 在任何情况下,表单值都可以作为数组使用,并且您可以使用数组的属性遍历任何可用值。


翻译自: https://www.ibm.com/developerworks/web/library/wa-phpform/index.html

php使用html表单提交

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页