- PHP的妙处在于表单变量可以无缝的集成到程序中
- HTTP请求是“无状态的”,不能保存一个页面的信息,一遍其它页面的访问
- PHP处理一个页面时,会检查URL和表单变量,上传文件,cookie等
- $_REQUEST包含了 $_GET、$_POST、$_FILES、$_COOKIE、$_SERVER、$_ENV
- PHP表单处理应用中都有两个重要步骤:数据验证和转义输出
希望使用一个HTML页面提交表单,然后在同一个页面中处理这个表单中输入的数据。想避免生成太多的页面。
使用$_SERVER[‘REQUEST_METHOD’]变量来确定请求是get还是post,如果是get则输出表单,如果是post则处理表单。
//通过$_SERVER返回的方法名都是大写的,所有使用GET
if($_SERVER['REQUEST_METHOD']=='GET'){//输出表单
}else{//处理表单
}
希望确保必须为一个表单元素提供一个值。例如,希望保证一个文本框不能为空。
使用filter_has_var()查看这个元素在相应输入数组中是否存在。
if(filter_has_var($_POST,'username')&&strlen($_POST['username'])>0){//判断在$_POST数组中是否有一个键为username的元素print $_POST['username']; //不仅要判断变量是否存在,还要判断其值是不是为空,并且需要对数据进行过滤filter_input($_POST,'username',FITER_SANITIZE_STRING);//filter_input会使用默认过滤器,FITER_SANITIZE_STRING会删除一些HTML中标记、&等
}
常用的输入数组
INPUT_POST //可以用来替换$_POST
INPUT_GET
INPUT_COOKIE
INPUT_SERVER
INPUT_ENV
扩展:filter_has_var() 的有关文档
希望确保在一个表单输入框输入一个数。例如,不希望一个人说他的年龄是old,而应该提供13或56等数字
使用FILTER_VALIDATE_INT过滤器。
//如果需要过滤浮点数FILTER_VALIDATE_FLOAT
$age = filter_input(INPUT_POST,'age',FILTER_VALIDATE_INT);
if(!$age===false){print "Submitted age is invalid.";
}//对于复杂的数据,可以使用正则表达式进行过滤
//要想提高程序性能,应当尽量少使用正则表达式,因为正则表达式很慢if(!preg_match('/^-?d+$/',$_POST['rating'])){//匹配一个可选的负号
}
扩展:验证过滤器 的有关文档.validate
希望知道用户提供的email是否合法
使用FILTER_VALIDATE_EMAIL过滤器。
$email = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);
if($email === false){//email不合法,使用FILTER_VALIDATE_EMAIL,效率比正则表达式高
}
希望确保从HTML下拉菜单生成的一个下拉单中选择一个合法的选项,下拉菜单默认选择第一个,单选按钮和复选框不会选中。
使用一个数组生成菜单。然后检查输入值是否在这个数组中来验证输入,使用in_array()。
$choices = array('Eggs','Toast','Coffee');
//验证输入是否在这个数组中
if(in_array($_POST['food'],$choices)){//验证成功
}else{//提示用户选择一个正确的选项
}
//在默认的选择中指定check="checked"
//无论验证什么数据,都需要通过验证之后再输出
希望确保用户输入的一个日期或者时间是合法的。例如确认身份证是否过期,出生年月等
使用checkdate() 函数。
//函数原型 bool checkdate(int $month, int $day, int $year)
if(!checkdate($_POST['month'],$_POST['day']),$_POST['year']){//时间不合法,checkdate可以自动判断是否是润年,每个月的天数
}
希望在一个HTML页面上安全的显示用户的输入数据。例如,允许用户评论一个博客,但是不希望评论中包含HTML或javascript脚本。
使用htmlentities() 函数。
在显示用户输入的数据之前,先将数据传入到htmlentities()中,也就是将输入进行转意
print 'The comment was: ';
print htmlentities($_POST['comment']);//htmlentities可以对所有的HTML实体的任何字符完成编码,默认使用的是UTF-8字符集
//htmlspecialchars()只能对 <、>、"和&,进行转意
希望处理用户上传的一个文件。例如建立一个图片分享网站,希望保存用户的照片数据。
使用$_FILES 获取上传文件的有关信息,上传文件时应该使用enctype=”multipart/form-data”。
<form method="post" enctype="multipart/form-data" ><!--需要使用-->
</form>
在$_FILES超级全局变量中,包含的文件的详细信息
//name 上传文件名
//type 文件MIME类型,由浏览器提供
//size 文件大小(字节数),由浏览器提供
//tmp_name 临时名,文件存储在服务器的位置
//error 错误,包含的值有0,1,2,3,4,6,7,8分别对应不同的值UPLOAD_ERR_OK(0) 上传成功,无错误UPLOAD_INI_SIZE(1) 上传文件的大小大于upload_max_filesize配置指令中的值UPLOAD_ERR_FORM_SIZE(2) 上传文件的大小大于表单FILE_SIZE元素的值UPLOAD_ERR_PARTAL(3) 只上传了文件的一部分UPLOAD_ERR_NO_FILE(4) 没有要上传的文件UPLOAD_ERR_NO_DIR(6) 由于没有零食目录来存储文件,所以上传失败UPLOAD_ERR_CANT_WRITE(7) PHP不能向磁盘中写文件UPLOAD_ERR_EXTENSION(8) 上传被一个PHP扩展中止//函数原型 bool move_uploaded_file(string $filename, string $destination)
//函数原型 bool is_uploaded_file ( string $filename )
//使用HTTP_POST上传文件的时候,在使用文件之前都需要使用is_uploaded_file进行检测。if(isset($_FILES['document'])&&$_FILES['document']['error']==0){$newPath ='/tmp/'.basename($_FILES['document']['name']);if(move_uploaded_file($_FILES['document']['name'],$newPath)){print "file saved in $newPath";}else{print "Couldn't move file to $newPath";}
}
希望使用一个显示多页面的表单,而且从一个页面切换时需要保留数据。例如,可能想建立一个调查,由于问题太多,所有无法把所有的都放在一个页面中。
使用会话跟踪 来存储各个阶段的表单的信息。
//会话使用规则,先要开启会话
session_start();
//写入会话
$_SESSION['key']=$value;
//读取会话内容
$_SESSION['key'];
//对于这类任务,非常适合使用SESSION来完成,可以将用户的填写的数据保存在服务器,这样能够保证各个请求很小。不用重新提交以前的数据。最后在全部填完的时候统一进行验证。
HTTP协议是无状态的协议,要想记住以前的状态,必须使用会话技术
希望防止用户将同一个表单提交多次。
在表单中包含一个隐含域,并指定一个唯一值。验证表单是,查看这个唯一值是否已经设置。可以使用uniqid()和md5()产生一个唯一的ID
//函数原型 string uniqid ([string $prefix = ""[,bool$more_entropy=false]])
//获取一个带前缀、基于当前时间微秒数的唯一ID。
由于使用uniqid()函数可能产生一些特殊的字符,所以使用md5()函数让其只有a-f的英文字母和数字
md5(uniqid());
//对于可能存在的一些非法使用,可以设置验证码,降低用户验证的频率。
在数据库中,通常需要将一些数据加密之后再存储,不能直接使用明文
在老版本的PHP中,希望访问表单输入变量,但不允许恶意用户在你的程序中设置任意全局变量。
在PHP5.4以前,禁用register_globals配置指令,以后的版本中废除这个指令,reigister_globals设置为on时,外部变量(包括来自表单和cookie的变量)将直接导入到全局命名空间。
一个表单元素允许用户选择多个选项,如下拉菜单或一组复选框,不过PHP只能看到其中的一个提交值。
表单元素名末尾加一对中括号([])
<input type="checkbox" name="boroughs[]" value="bronx">The Bronx
<input type="checkbox" name="boroughs[]" value="queens">The Queens
<input type="checkbox" name="boroughs[]" value="manhat">The Manhat//把提交的数据看着是$_GET或者$_POST中的一个数组
print 'I Love '.join(' and ',$_POST['boroughs']).' !';
//表单元素中加[],告诉PHP这不是一个标量,而是一个数组
本文发布于:2024-02-05 04:45:55,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170724447463152.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |