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只能看到其中一个提交值。
解决方案
表单元素名末尾加一堆中括号【】
命名一组复选框
<input type="checkbox" name="boroughs[]" value="bronx1">the bronx1
<input type="checkbox" name="boroughs[]" value="bronx2">the bronx2
<input type="checkbox" name="boroughs[]" value="bronx3">the bronx3
<input type="checkbox" name="boroughs[]" value="bronx4">the bronx4
<input type="checkbox" name="boroughs[]" value="bronx5">the bronx5
处理提交的一组复选框
print 'I love'.join(' and ',$_POST['boroughs']).'!';
提交多值表单元素的等价代码
$_POST['boroughs'][]='bronx1';
$_POST['boroughs'][]='bronx2';
$_POST['boroughs'][]='bronx3';