第九章表单

9.0引言

PHP的妙处在于表单变量可以无缝地集成到程序中。这使得web编程即平滑有简单,可以加快从web表单到PHP代码再到HTML输出的周期。

不要忽略输入验证(确保表单输入的内容是程序可以接受的)和输出转义(确保恶意用户无法利用你的网站攻击其他人)。技巧9.2技巧9.9讨论数据验证,技巧9.10讨论输出转义

9.1处理表单输入

问题希望使用一个HTML页面提交表单,然后在同一个页面中处理在这个表单中输入的数据。换句话说,想避免生成太多页面(每个页面分别处理一个事务中的不同步骤)
$_SERVER['REQUEST_METHOD']变量来确定请求时用get还是post方法提交的。

get方法:“嘿,服务器,给我一些你有的东西”
post方法:“嘿,服务器,这里的数据有变化。”

9.2验证表单输入:必填域。

问题
希望确保必须为一个表单元素提供一个值。例如,希望保证一个文本框不为空
解决方案?
使用filter_has_var()查看这个元素在相应的输入数组中是否存在。
if(!filter_has_var(INPUT_POST,'flavor'))
{
print 'you must enter your favorite ice cream flavor.';
}
filter_has_var()函数要求检查PHP接收的数据。
第一个参数指出查看哪里的数据,
INPUT_POST会检查请求体中的POST数据。

9.3验证表单输入:数字

问题
希望确保一个表单输入框输入了一个数。
解决方案
如果需要一个整数 ,可以使用FILTER_VALIDATE_INT过滤器
$age=filter_input(INOUT_POST,'price',FILTER_VALIDATE_INT);
if($age==false)
{
print "submitted age is invalid";
}

9.4验证表单输入:email地址

$age=filter_input(INOUT_POST,'price',FILTER_VALIDATE_EMAIL);
if($age==false)
{
print "submitted email is invalid";
}

9.11处理上传文件

问题

希望处理用户上传的文件。例如,要构建一个照片分享网站,希望保存用户提供的照片。

解决方案

使用$_FILES数组获得上传文件的有关信息。

9.14防止多次提交相同的表单

问题

希望防止用户将同一个表单提交多次
解决方案
在表单中包含一个隐藏域,并指定一个唯一的值。验证表单时,查看提交的表单是否已经有这个值。如果有,则拒绝提交。如果还没有,则处理表单。并记录这个值以备以后使用。
使用uniqid()和md5()函数在表单插入一个唯一的ID域。

uniqid()函数可以生成一个可接受的一次性token,md5()函数并不会为这个token增加更多随机性,而是会对token中的字符加以限制。uniqid()的结果可能是不同字母和其他字符的一个混合的结果。

9.15防止全局变量注入

问题

对于老版本的register_globals的开启的情况下,外部可能会更改全局变量,而你却全然不知。

解决方案

当然是去手动关闭它

9.16处理变量名中包含点号的远程变量

问题
希望处理一个变量,变量名中有一个点号,不过提交表单时,无法在$_get和$_POST中找到这个变量。
解决的办法
将变量名中的点号替换为一个下划线。
将hot.dog转换为hot_dog

9.17使用有多个选项的表单元素

问题
一个表单元素允许有用户选择多个选项,如下拉菜单或一组复选框,不过PHP只能看到其中一个提交值。

解决方案

表单元素名末尾加一堆中括号【】
命名一组复选框
the bronx1
the bronx2
the bronx3
the bronx4
the bronx5

处理提交的一组复选框
print 'I love'.join(' and ',$_POST['boroughs']).'!';
提交多值表单元素的等价代码
$_POST['boroughs'][]='bronx1';
$_POST['boroughs'][]='bronx2';
$_POST['boroughs'][]='bronx3';

你可能感兴趣的:(第九章表单)