表单传值的意义
定义:表单传值,就是通过在HTML中使用表单标签,通过表单来获取用户的数据,然后通过HTTP协议将数据递交给后台。
1、表单传值的意义:表单传值能够帮助网站收集用户数据,实现用户和网站后台的数据交互。
2、表单传值方式:表单传值就是利用HTML的一组特点标签,然后通过浏览器解析后,给用户提供一种数据录入的入口,并且容许用户在数据录入后,实现数据递交。
总结:表单传值是能够实现动态网站非常重要的一步,不仅能够实现用户的数据递交,还能帮助用户实现动态的数据定制。
表单传值方式
数据递交的本质就是利用HTTP协议进行数据递交,在HTTP协议中,传输规则有6中,而HTML的表单传值通常只用到2中,就是GET和POST.
- GET: 通过发送HTTP请求来从服务器获取数据,get通常是通过自身携带数据来获取服务器数据。显示的递交数据,用来查询数据
- POST:直接递交数据给服务器。隐式递交用户数据,通常该类数据都是用来存储到后台数据库的。
GET和POST实现
GET传值的方式有以下几种
- a标签传输:直接在href属性对应的链接中添加数据,用?将URL和数据分离,数据绑定方式是键值对,即:名字=值,多个数据用&符号链接
<html>
<head><head>
<body>
<a href="http://www.taobao.com/index.php?keywords=笔记本&type=超级本">淘宝.笔记本.超级本</a>
<!--其中http://是协议,www.taobao.com属于主机地址,/index.php是URL,而?之后都是对应的数据:keywords和type都属于数据的名字
<body>
<html>
- form标签
<html>
<head></head>
<body>
<form action="请求脚本文件地址" method="GET">
<input type="text" name="keywords" value=""/>
<input type="text" name="type" value=""/>
<input type="submit" value="检索"/>
</form>
</body>
</html>
- loaction对象的href属性:loaction是window对象的一个属性,用来包含当前窗口对应的url信息,但是同时该属性本身还有一个href属性,可以用来动态的改变窗口对应url,这个时候需要利用事件(javascript)
<html>
<head></head>
<body>
<input type="button" value="获取当前URL" onclick="alert(window.location)"/>
<input type="button" value="改变当前URL" onclick="window.location.href=‘http://www.baidu.com/index.php?search=电脑’“/>
</body>
<html>
- location对象的assign()方法:assign()方法与href属性相似,都是需要通过事件操作来设定某些触发点,然后用户触发后执行对应的窗口跳转
<html>
<head></head>
<body>
<input type="button" value="改变当前URL" onclick="window.location.assign=(‘http://www.baidu.com/index.php?search=电脑’)“/>
</body>
<html>
POST传值方式,只需要修改表单中 方法属性(method=‘post’)
GET与POST的区别:
两者都是实现数据从浏览器传输到服务器端,无本质区别。
- 目标用途区别:GET主要用来获取服务器数据,提供的是一些数据信息片段,服务器通过数据片段获取数据;POST主要用来递交数据,即数据最终会实现数据的数据变更。
- 实现方式区别:GET可以使用URL,form表单和window.location来实现(本质还是URL),而post只能通过表单实现
- 执行效果区别:GET传值在递交时会在浏览器地址中显示,而POST不会(所以POST安全性更好)
- 传输大小区别:理论上讲GET和POST没有区别,但是浏览器做了对GET限制,不同浏览器大小不一样,IE为2K,而POST依然没有限制。
表单传值-PHP接收数据
- $_GET
- $_POST
- $_REQUEST
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php?keywords=娃娃" method="GET">
<input type="text" name="keywords" value="">
<input type="text" name="type" value="">
<input type="submit" name="" value="检索">
</form>
</body>
</html>
<?php
echo $_POST['keywords'].'<br>';
echo $_POST['type'].'<br>';
echo $_GET['keywords'].'<br>';
echo $_GET['type'].'<br>';
echo $_REQUEST['keywords'].'<br>';
echo $_REQUEST['type'].'<br>';
?>
表单传值-复合表单提交
1、单选框操作
提供多个选项给用户选择,但是最终用户只能选一个,即 用户表单有多个,最终传递给服务的数据只有一个。这类处理比较简单,表单多个,但是名字一样,后台只需接受一个。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php" method="POST">
<input type="radio" name="gender" value="男">
<input type="radio" name="gender" value="女">
<input type="radio" name="gender" value="保密">
<input type="submit" name="" value="递交">
</form>
</body>
</html>
<?php
echo $_POST['gender'];
?>
2、复选框操作
不能按照单选框方式进行,利用[]命名表单,php会认为是数组特性,把多选值存储到数组
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php" method="POST">
<input type="checkbox" name="hobby[]" value="篮球">
<input type="checkbox" name="hobby[]" value="足球">
<input type="checkbox" name="hobby[]" value="排球">
<input type="checkbox" name="hobby[]" value="地球">
<input type="submit" name="" value="递交">
</form>
</body>
</html>
<?php
var_dump($_POST['hobby']);
?>
数据回显
表单传值-文件上传操作
表单上传:
要上传文件,表单中的编码格式有所变化。 enctype=“multipart/form-data”,当然要使用post方式递交
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file" value="">
<input type="submit" name="submit" value="上传">
</form>
</body>
</html>
后台接收:
使用$_FILE来接收文件
<?php
$file=$_FILES[file]; // file为表单中的name属性
?>
文件上传后,在PHP端保存5个信息
- name:文件在客户端本地的文件名字
- type:文件类型
- tmp_name:文件在服务器临时文件夹保存的临时文件名字
- error:错误代码
- size:大小长度
array(1) {
["file"]=>
array(5) {
["name"]=>
string(6) "fa.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(27) "C:\Windows\temp\phpBF1F.tmp"
["error"]=>
int(0)
["size"]=>
int(37714)
}
}
注意:文件上传以后要记得移出临时文件夹,否则php会认为数据没有意义,会自动删除,添加一下代码:
使用: move_uploaded_file
<?php
$file=$_FILES['file'];
if($file['error']==0) {
move_uploaded_file($file['tmp_name'], 'upload/'.$file['name']);
}
?>
注意:文件是一种外部数据,PHP不信任任何外部数据,因此PHP在进行文件操作的时候一定要进行安全判断。而文件上传是一个非常普遍统一的操作,因此可以封装函数进行。
<?php
// 文件上传函数封装
/*
* @param1 array $file,要上传的文件信息,包含5个元素
* @param2 string $path,存储位置
* @param3 string &error,错误信息
* @param4 array $type=array(),MIME类型限定
* @param5 int $size=2000000,默认2M
* @return mixed,成功返回文件名字,失败返回false
*/
function fileupload($file,$path,&$error,$type=array(),$size=2000000){
//1、判定文件本身是否有效文件
if(!isset($file['error'])){
$error='文件无效';
return false;
}
//2、有效路径判定
if(!is_dir($path)){
$error='存储路径无效';
return false;
}
//3、判断文件本身上传是否成功
switch ($file['error']) {
case 1:
case 2:
$error='文件超过服务器允许大小';
return false;
case 3:
$error='文件只有部分成功';
return false;
case 4:
$error='用户没有选择要上传的文件';
return false;
case 6:
case 7:
$error='服务器操作失败';
return false;
}
//4、判定类型是否符合
if(!empty($type) && !in_array($file['type'],$type)){
$error='当前上传的文件类型不符';
return false;
}
//5、文件大小判定
if($file['size']>$size){
$error='文件大小超过当前允许范围,当前允许的大小是:'. string($size/1000000).'M.';
}
//6、移动文件:转存
$newfilename=getNewName($file['name']);
if(@move_uploaded_file($file['tmp_name'], $path . '' . $newfilename)){
return $newfilename;
}else{
$error='文件上传失败';
return false;
}
}
//构造一个文件名 随机生成
function getNewName($filename,$rand=6){
//1.时间日期部分
$newname=date('YmdHis');
//2.增加随机部分
$old=array_merge(range('a','z'),range('A','Z'));
shuffle($old);
for($i=0;$i<$rand;$i++){
$newname .=$old[$i];
}
//3.组织有效文件名
return $newname . strstr($filename,'.');
}
?>
//调用部分,亲测可用
<?php
$file=$_FILES['file'];
include_once 'fileupload.php';
$res=fileupload($file,'upload/',$error);
if($res){
echo "文件上传成功";
}else{
echo $error;
}
?>
表单传值-多文件上传
站在用户角度需要一次性上传多文件,但是PHP系统还是要挨个处理。
多文件上传分为两种方式:
1、有多个文件需要上传,彼此无关联,本质还是单文件上传
html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
头像: <input type="file" name="head_img" value=""> //表单名字都不一样
身份证正面照: <input type="file" name="id_im1" value="">
身份证反面照: <input type="file" name="id_im2" value="">
<input type="submit" name="submit" value="上传">
</form>
</body>
</html>
2、一次上传同类文件,需要一次管理
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="file" name="poto[]" value="">
<input type="file" name="poto[]" value=""> // 表单名称是数组形式,类似复合表单
<input type="file" name="poto[]" value="">
<input type="submit" name="submit" value="上传">
</form>
</body>
</html>
多个文件后台处理:
- 对于第一种情况后台直接利用封装好的函数多次调用上传即可
<?php
foreach($_FILES as $file){
$res=uploadfile($file,'文件保存路径',$error)
if($res===false){
exit($error);
}
echo"文件:".$file['name'].'上传成功';
}
?>
- 但是第二种方式比较复杂一些
通过观察文件结构发现,$_FILES 接受的是一个包含5元素的二维数组:
imge[5][n]={ name[n],type[n],tmp_name[n],error[n],size[n]}
那么我们可以将每个文件的单独5要素读取出来,然后形成一个文件信息分别上传即可。
<?php
include_once 'fileupload.php';
$image=$_FILES['imge'];
for($i=0,$len=count($image['name']);$i<$len;$i++){
$file = array(
'name' =>$image['name'][$i],
'type' =>$image['type'][$i],
'tmp_name' =>$image['tmp_name'][$i],
'error' =>$image['error'][$i],
'size' =>$image['size'][$i]
);
fileupload($file,'upload/',$error);
}
?>