PHP零基础入门-表单传值

表单传值的意义

定义:表单传值,就是通过在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);
}
?>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值