表单传值

为什么要表单传值?

表单传值的方式

GET传值

POST传值

GET和POST两种传参方式的不同:

PHP接受数据的三种方式

PHP处理复选框数据

复选框表单的命名方式

复选框数据的接受形式

复选框数据的常见处理

复选框细节:

文件上传

原理

表单写法

$_FILES变量详解

移动临时文件到目标位置

多文件上传

同名表单与不同名表单

文件上传后续问题


可以尝试在URL出直接传值:

在这里插入图片描述

证明在REQUEST中POST会覆盖GET:

    <form method="POST" action="get_post_request1.php?usernaem=getusernaem">
        <input type="text" name="username" value="" />
        <input type="password" value="" />
        <input type="submit" name="sub" value="submit" />
    </form>

在浏览器中运行结果:

在这里插入图片描述

html代码:

    <form action="checkbox.php" method="POST">
        <input type="checkbox" name="hobby[]" value="basketball">basketball
        <input type="checkbox" name="hobby[]" value="football">football
        <input type="checkbox" name="hobby[]" value="pingpang">pingpang
        <input type="submit" name="btn" value="提交" />
    </form>

php接收代码:

<?php
header('Comtent-type:text/html;charset=utf-8');
echo '<pre/>';
print_r($_POST);
?>

4、PHP组织SQL直接存储到数据库

取出来复选框数据显示:

(1)、如果是反过来操作,那么取出数据之后使用explode把字符串变成数组

explode(‘分隔符’,‘字符串’)

<?php
header('Comtent-type:text/html;charset=utf-8');
echo '<pre/>';
$hobby=$_POST['hobby'];
$hobby_string=implode($hobby,'|');
 var_dump(explode('|',$hobby_string));
?>

在这里插入图片描述

(2)在HTML显示当中,通过判断复选框元素是否在数组中存在,来选定复选框checkbox是否有checked="checked"属性

in_array()

(3)其他常规的同名表单项的处理

除了radio button 和checkbox付窜狂,很少会出现同名的复选框,如果非要使用同名的来进行管理,那么可以采用checkboc方式进行操作

  1. 表单中同名增加
  2. PHP接收时数组处理
  3. PHP接收转换为有格式的字符串
  4. 数据库字符串存储


尝试制作一个form上传表单:
在这里插入图片描述

在PP中,有一个预定义变量$_FILE文件用于存放用户上传的文件

<?php
header('Content-type:text/html;charset:utf-8');
echo '<pre>';
var_dump($_POST);
var_dump($_FILES);
?>

在这里插入图片描述

size:文件上传的数据大小(后期PHP根据实际需求确定是否该保留)

当商品需要进行多个维度图片说明的时候,需要使用多文件上传

针对是不同内容所以表单名不一样:批量解决问题

    <form action="multi_upload_form.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="head" />
        <input type="file" name="body" />
        <input type="file" name="foot" />
        <input type="submit" name="btn" value="批量上传" />
    </form>

多文件上传的$_FILES变量的数据结构形式

批量上传:同名表单:将表单名字形成一个数组,而且同时将文件对应的五个要素:name tmp_name size type error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的:name[0]和type[0]是属于一个文件的属性

    <form action="multi_upload_form.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="image[]" />
        <input type="file" name="image[]" />
        <input type="file" name="image[]" />
        <input type="submit" name="btn" value="批量上传" />
    </form>

批量上传:不同命表单:每个文件都会形成一个属于自己独立的5个元素的数组

    <form action="multi_upload_form.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="head" />
        <input type="file" name="body" />
        <input type="file" name="foot" />
        <input type="submit" name="btn" value="批量上传" />
    </form>
![在这里插入图片描述](https://img-blog.csdnimg.cn/6b8f257ba1f4445085a0857de06114ac.png)
#### 对多文件上传信息的遍历读取和处理1、不同名多文件上传处理方式:按照表单名字从$_FILES中取出来就可以直接使用(明确知道表单中有多少文件上传);如果不确定表单中有多少个文件上传,不适合挨个去取(效率低),可以通过遍历$FILES数组,挨个取出实现文件上传```php
<?php
header('Content-type:text/html;charset=utf-8');
echo '<pre>';
// 不同命文件遍历处理方式
foreach($_FILES as $file)
{
    // $file就是一个完整的上传文件信息;找到临时路径,指定存放路径
    if(is_uploaded_file($file['tmp_name']))
    {
        move_uploaded_file($file['tmp_name'],'upload/' . $file['name']); 
    }
}
?>

2、同名多文件上传:想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name tmp_name size error type 挨个取出来,然后存放到不同的数组中

<?php
header('Content-type:text/html;charset=utf-8');
echo '<pre>';
// 同名文件遍历处理方式
if(isset($_FILES['image']['name']) && is_array($_FILES['image']['name'])){
    // 遍历构造数组元素
    $images=array();
    foreach($_FILES['image']['name'] as $k => $file)
    {
        $images[]=array(
            'name'=>$file ,
            'tmp_name'=>$_FILES['image']['type'][$k] ,
            'type'=>  $_FILES['image']['tmp_name'][$k],
            'error' =>  $_FILES['image']['error'][$k],
            'size' =>  $_FILES['image']['size'][$k],
        );
        
    }
}
print_r($images);
?>

文件上传后续问题

实现上传功能代码的重复利用:封装文件上传函数

功能:上传文件

条件:条件判断

1、文件类型是否合适?外部指定MIME类型

2、文件存储到什么位置?外部指定

3、文件格式限制(文件后缀)?外部指定

4、文件大小限制?

结果:实现文件上传

1、成功:结果能够在以后看到:需要将文件的路径和文件名字返回(存储到数据库)

2、失败:返回false,指定错误原因(引用参数)

(1)封装出一个上传函数

<?php
// php文件上传功能封装函数
// 实现文件上传
// @param1 array $file ,需要上传的文件信息:一维5元素数组(name/tmp_name/erroe/size/type)
// @param2 array $allow_type,允许上传的MIME类型
// @param3 string $path ,存储的路径
// @param4 string &$error ,如果出现错误的原因
// @param5 array $allow_format=array().允许上传的文件格式
// @param6 int $max_size=20000 ,允许上传的最大值
function upload_single($file,$allow_typem,$path,&$error,$allow_format=array(),$max_size=20000)
{}
?>

(2)判断文件是否有效

//判断文件是否有效
if(is_array($file) ||  !isset($file['error']))
{
    //文件无效
    $error='这不是一个有效的文件'
    return false;
}

(3)判断文件存储路径是否有效

if(!is_dir($path))
{
    // 路径不存在
    $error='文件路径不存在';
    return false;
}

(4)判断文件本身上传的过程中是否有错误

switch ($file['error']){}
    case 1:
    case 2:
        $error='文件超出服务器允许大小';
        return false;
    case 3:
        $error='文件上传过程中出现了问题,只上传了一部分';
    case 4:
        $error ='用户没有选中要上传的文件';
        return false;
    case 6:
    case 7 :
        $error ='文件保存失败';
        return  false;
}

(5)文件类型的处理

// 判断MIME类型
if(in_array($file['type'],$allow_type))
{
    $error='当前文件类型不允许上传';
    return false;
}

(6)文件格式的处理

// 判断后缀是否允许
// 取出后缀
$ext = ltrim(strrchr($file['name'],'.'),'.');
if(!empty($allow_format)&&!in_array($ext,$allow_format))
{
    //不允许
    $error='当前文件的格式不允许上传';
}

(7)文件大小的处理

// 判断当前文件大小是否满足当前需求
if($file['size']> $max_size)
{
    $error='当前上传的文件超出大小,最大允许大小为' . $max_size .'字节';
    return false;
}

(8)移动到指定目录

//移动到指定目录
//构造文件名字
if(is_uploaded_file($file['tmp_name']))
{
    $error='错误,不是上传文件';
    return false;
}
if(move_uploaded_file($file['tmp_name'],$path . '/' . 文件名字))
{
    return 文件名字;
}
else{
    $error='文件上传失败';
}

(8)重名的处理:上传同名文件?中文名字怎么修改为正确格式?

//构造文件名字:类型:年月日+随机字符串.$ext
$fullname=strstr($file('type','/',TRUE)) . date('Ymd');
//产生随机字符
for($i=0;$i<4;$i++)
{
    $fullname .= chr(mt_rand(65,90));
}
// 拼凑后缀
$fullname .+ '.' . $ext; 
if(is_uploaded_file($file['tmp_name']))
{
    $error='错误,不是上传文件';
    return false;
}
if(move_uploaded_file($file['tmp_name'],$path . '/' . $fullname))
{
    return $fullname;
}
else{
    $error='文件上传失败';
}

(9)提供数据

// 提供数据
$file=$_FILES['image'];
$path='uploads';
$allow_type=array('image/jpg','image/gif');
$allow_format=array('jpg','gif','jpeg');
$max_size='8000000';
if($filename=upload_single($file,$allow_type,$path,$allow_format,$max_size))
{
echo $filename;
}
else {
    echo $error;
}
?>

点赞(12) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部