使用订单的目的是为了收集客户订单。在PHP中,获得客户输入的具体数据是非常简单的,但是具体的方法还依赖于你所使用的PHP版本,以及php.ini文件的设置。
1.5.1 简短、中等以及冗长风格的表单变量
在PHP脚本中,可以用PHP变量的形式访问每一个表单域,其中PHP变量名称必须与表单域的名称一致。你可以很容易识别PHP的变量名称,因为它们都是以$符号开始的。(漏掉这个$符号是一个常见的编程错误。)
根据PHP版本和设置的不同,通过变量,可以有3种方法来访问表单数据。这些方法并没有正式的名称,因此我们给它们定义了3个昵称,分别是简短风格、中等风格和冗长风格。在任何情况下,一个页面上提交给PHP脚本的每一个表单域在PHP脚本中都是可以使用的。
你可以按如下所示的方法访问tireqty域的内容:
$tireqty//short style
$_POST[/'tireqty/']//medium style
$HTTP_POST_VARS[/'tireqty/']//long style
在这个例子以及整本书中,我们将使用中等风格(也就是,$_POST[/'tireqty/'])来引用表单变量,但是为了便于使用,我们创建了简短风格的变量。然而,在代码中,我们采用这种风格而不是自动选择的风格来引用变量,是因为自动选择风格可能会带来安全性的问题。
对于读者自己的代码,读者可能会决定使用不同的方法,但是必须做出正确的选择。接下来我们将介绍上述不同的方法。
■简短风格($tireqty)非常方便,但是需要将register_globals配置选项设置为on。由于安全性的原因,在默认情况下,该选项的默认设定值为off。这种风格的标记容易导致产生安全性问题的错误,也就是为什么不推荐的原因。在PHP 6中,这个配置选项可能会被弃用,因此在新代码中使用这种风格的变量名称并不是好的想法。
■中等风格($_POST[/'tireqty/'])是如今所推荐的。如果基于中等风格,创建简短版本的变量名称(我们将在整本书中使用这种方式)将不会产生安全性问题,只是便于使用的问题。
■冗长风格($HTTP_POST_VARS[/'tireqty/'])是最详细的,但是请注意,它已经被弃用,因此从长远看,这种风格可能会被删除。这种风格过去曾是最容易移植的,但是如今可以通过register_long_arrays配置指令禁用它,这样可以改进性能。因此,同样地,如果不需要将你的代码安装在旧版本的服务器上,就没有必要在新代码中使用这种风格。
当使用简短风格时,脚本中的变量名称应该与HTML表单中的表单域名称相同。在脚本中,不需要声明变量或者创建这些变量。就如同向一个函数传递参数,这些变量将被传递到脚本中。如果读者使用这种风格,就可以使用类似于$tireqty的变量。表单中的tireqty域将在表单处理脚本中创建$tireqty变量。
对变量如此方便的访问是非常受欢迎的,但是在将该选项设置为on之前,读者应该想想为什么PHP开发小组将该选项设置为off。
像这样对变量的直接访问是非常方便的,但是这可能会使读者遇到破坏脚本安全性的编程错误。由于表单变量会自动转换成全局变量,因此在你所创建的变量与直接来自用户的不可信任的变量之间没有明显的区别。
如果没有对自己的变量赋给一个初始值,脚本用户就可以像表单变量一样传递变量和值,这样就可能造成混乱。如果选择使用方便的简短风格来访问变量,必须注意对你自己的变量赋予一个初始值。
中等风格涉及了从$_POST、$_GET或$_REQUEST数组之一检索变量。$_GET或$_POST数组之一都可以保存表单变量的细节。使用哪一个数组取决于提交表单时使用的方法是POST还是GET。此外,通过POST或GET方法及其组合方式提交的所有数据都可以通过$_REQUEST数组获得。
如果表单是通过POST方法提交的,tireqty文本输入框中的数据将保存在$_POST[/'tireqty/']中。如果表单是通过GET方法提交的,数据将保存在$_GET[/'tireqty/']。在任何一种情况下,数据都可以通过$_REQUEST[/'tireqty/']获得。
这些数组被称作是超级全局(superglobal)变量。在我们介绍变量的作用域时,我们还将在稍后的内容详细介绍这些超级全局变量。
下面,让我们看一个创建便于使用的变量副本的例子。
要将一个变量的值复制给另一个变量,你可以使用赋值操作符。在PHP中,赋值操作符是等于号(=)。如下代码将创建一个名为$tireqty的新变量,并且将$POST[/'tireqty/']的内容复制给这个新变量:
$tireqty=$_POST[/'tireqty/'];
将如下代码块放置在订单处理脚本的开始处。在本书中,处理表单数据的所有脚本的开始处都将包含与这个相似的代码块。由于这段代码不会产生任何输出,因此无论将这段代码放置在开始一个HTML页面的<html>和其他HTML标记之前还是之后,都不会有任何差异。通常,我们将这段代码放置在脚本的最开始处,这样容易查找。
<?php
//create short variable names
$tireqty=$_POST[/'tireqty/'];
$oilqty=$_POST[/'oilqty/'];
$sparkqty=$_POST[/'sparkqty/'];
?>
这段代码将创建3个新变量:$tireqty、$oilqty和$sparkqty,并且将通过POST方法从表单中传送过来的数据分别赋值给这3个变量。
要使该脚本能够完成一些可见的操作,可以在PHP脚本结束处添加如下所示的代码:
echo/'<p>Your order is as follows:</p>/';
echo$tireqty./'tires<br/>/';
echo$oilqty./'bottles of oil<br/>/';
echo$sparkqty./'spark plugs<br/>/';
在这里,还没有检查变量内容,因此也无法确认一些重要数据已经进入了每一个表单域。尝试输入一些错误数据并且观察发生的事情。阅读本章的剩余部分后,读者可能希望尝试在该脚本中添加一些数据校验的逻辑。
像上例中,从用户输入直接获得输入并输出到浏览器是一个有风险的操作,它可能带来安全隐患。你应该对数据进行过滤。在第4章,我们将介绍输入过滤。在第16章将深入介绍安全性问题。
如果现在于浏览器中载入这个文件,该脚本输出结果将类似于图1-4。当然,具体的数值还取决于在表单中输入的数据。
图 1-4 在processorder.php中很容易访问用户输入的表单变量在接下来的内容中,我们将介绍这个例子中几个有趣的方面。