欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义错误类-----2019-10-12

程序员文章站 2022-03-11 13:41:40
...

1、. 写一个自定义异常类来处理上传过程以及各种错误

前端html代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <form action="task1-1.php" method="POST" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="3145728">
        <input type="file" name="my_file" id="">
        <button>上传</button>
    </form>
</body>

</html>

后端PHP代码定义错误类:

<?php 

namespace _1012task1;

// 1.自定义错误提示

use Exception;

class file_upload_error extends Exception
{
    public function __construct($message="",$code=0)
    {
        parent:: __construct($message,$code);
        $this->errorInfo();
    }
    public function errorInfo()    
    {   // heredoc:用来输出大段的html代码或字符,中间允许变量存在
        return <<<"ERROR"
        <h2>
        <strong>{$this->getCode()}:</strong>
        <span style="color:red">{$this->getMessage()}</span>
        </h2>
        ERROR;
    }
}
try
{
    
    // 2.文件上传处理

    // 配置上传参数
    // 允许文件上传的类型
    $fileType=['jpg','gif','png','jpeg']; 

    // 允许设置上传文件的最大长度
    $fileSize = 3145728;

    // 上传到服务器上指定的目录
    $filePath = '/upload/';

    // 原始文件名
    $fileName = $_FILES['my_file']['name'];

    // 上传到服务器上的临时文件名
    $tempFile = $_FILES['my_file']['tmp_name'];


    // print_r($_FILES['my_file']);
    // exit;
    // 3.判断文件上传是否成功
    $uploadError = $_FILES['my_file']['error'];
    if ($uploadError>0)
    {
        switch ($uploadError)
        {
            case 1: throw new file_upload_error('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1000);
            // case 2: die((new file_upload_error('上传文件大小不能超过3M',1001))->errorInfo());
            case 2: throw new file_upload_error('上传文件大小不能超过3M',1001);
            // case 3: die((new file_upload_error('上传文件不完整',1002))->errorInfo());
            case 3: throw new file_upload_error('上传文件不完整',1002);
            // case 4: die((new file_upload_error('文件上传为空',1003))->errorInfo());
            case 4: throw new file_upload_error('文件上传为空',1003);
            // case 6: die((new file_upload_error('找不到临时文件',1004))->errorInfo());
            case 6: throw new file_upload_error('找不到临时文件',1004);
            // case 7:die((new file_upload_error('文件写入失败',1005))->errorInfo());
            case 7: throw new file_upload_error('文件写入失败',1005);
            // default: die((new file_upload_error('未知错误',1006))->errorInfo());
            default: throw new file_upload_error('未知错误',1006);
        }
    }
//判断文件大小
$file_size=$_FILES['my_file']['size'];
if ($file_size>$fileSize)
{
     throw new file_upload_error('上传文件大小不能超过3M',1001);
}



    // 4.判断上传文件格式是否正确
    $extensions = explode('.',$fileName);
    $extension = end($extensions);
    if(!in_array($extension,$fileType))
    {
        // die(((new file_upload_error('文件格式错误,不允许上传'.$extension.'文件类型',1007)))->errorInfo()) ;
        throw new file_upload_error('文件格式错误,不允许上传'.$extension.'文件类型',1007);
    }

    //5.为了防止同名覆盖, 将上传的文件重命名:命名格式md5+时间戳
    $fileName = date('Ymdhis',time()).md5(mt_rand(1,99)).'.'.$extension;

    //6.文件上传
    if (is_uploaded_file($tempFile))
    {
        if (move_uploaded_file($tempFile,__DIR__.$filePath.$fileName))
        {
            echo '<script>alert("文件上传成功");history.back();</script>';
        }
        else
        {
            // die((up_load_error('文件无法移动到制定目录,请检查目录权限',1008))->errorInfo());
            throw new file_upload_error('文件无法移动到制定目录,请检查目录权限',1008);
        }
    }
    else
    {
        // die((new file_upload_error('非法操作',1009))->errorInfo());
        throw new file_upload_error('非法操作',1009);
    }
}
catch(Exception $e)
{
    echo $e->errorInfo();
    echo '<br>';
}

运行结果:

自定义错误类-----2019-10-12

自定义错误类-----2019-10-12


2、写一个与指定数据表绑定的类, 实现基本的模型功能,例如查询, 新增, 更新,删除等操作

实例

<?php
namespace _1012task2;

use PDO;

interface iDB{
    const dsn='mysql:host=127.0.0.1;dbname=video';
    const user='root';
    const pwd = 'root';
}

class staff implements iDB{
    protected $staff_id;
    protected $name;
    protected $age;
    protected $sex;
    protected $position;
    protected $mobile;
    protected $hiredate;
    protected $pdo=null;
    protected $table= 'staff';
    protected $results;

    public function __get($name){
        return $this->$name;
    }
    public function __set($name,$value){
        return $this->$name=$value ;
    }
    public function __construct(){
        $this->sex=$this->sex ? '男' : '女';
        $this->hiredate=date('Y-m-d',$this->hiredate);
        $this->pdo=new PDO(iDB::dsn,iDB::user,iDB::pwd);
    }
    //查询
    public function select($field=' * ',$where=''){
        $field=empty($field) ? ' * ' : $field;
        $where=empty($where) ? '' : ' WHERE '.$where;
        $sql = ' SELECT '.$field.' FROM '.$this->table.$where;
        $stmt = $this->pdo->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_CLASS, staff::class);
        $stmt->execute(); 
        $this->results=$stmt->fetchAll();  
    }
    // 新增
    public function insert($data){
        $fields=' (name, age, sex, position, mobile, hiredate) ';
        $values=' (:name, :age, :sex, :position, :mobie, :hiredate)';
        $sql = 'INSERT INTO '.$this->table.$fields.' VALUES '.$values;   
        $stmt=$this->pdo->prepare($sql);
        $stmt->setFetchMode(PDO::FETCH_CLASS,staff::class);
        if($stmt->execute($data)){
            if($stmt->rowcount()>0){
                return '插入了'.$stmt->rowcount().'条数据,最后插入的数据主键为:'.$this->pdo->lastInsertId();
            }else{
                die('<pre>'.print_r($stmt->errorInfo(),true));
            }
        }
    }
    // 修改
    public function updata($data,$where){
        $ketArray = array_keys($data);
        $set = '';
        foreach($ketArray as $kvalue){
            $set.=$kvalue .' = :'.$kvalue.', ';
        }
        $set = rtrim($set,', ');
        if(!empty($where)){
            $where = ' WHERE '.$where;
            $set = rtrim($set,', ');      //删除$set值最右侧的空格与预定的', '字符
            $sql = ' UPDATE ' . $this->table. ' SET ' .$set.$where;     //sql语句拼接
            $stmt = $this->pdo->prepare($sql);      //预处理
            $stmt->execute($data);      //绑定参数并执行
            return $stmt->rowCount();        
        }else{
            return '不允许无条件更新。';
        }
    }
}
$staff=new staff();
$staff->select();
foreach($staff->results as $staff){
    echo "<li>{$staff->staff_id}---<span style="color:red;font-size:bold>"{$staff->name}</span>---{$staff->sex}---{$staff->hiredate}</li>";
}
$staff->name='James';
$staff->age=30;

echo "$staff->name---$staff->age";

?>

运行结果:

自定义错误类-----2019-10-12

总结:

    1、在自定义错误类的时候需要从系统Exception类进行继承,并且子类只能改写父类的__construct()构造方法和errorInfo()方法;不能修改其他方法,在错误接收时,父类Exception可以接收子类抛出的错误内容和样式。

    2、类绑定数据表需要根据数据表字段来设置类的属性,在查询的时候,查询结果可以直接调用类的属性来输出想要的数据,查询的时候不需要设置字段,可以再输出的时候在根据自己想要的结果输出;在增加、修改和删除数据方面和未绑定数据表的类相比好像没有优势。