博客列表 >错误处理和文件上传以及模型关联------2019-10-31

错误处理和文件上传以及模型关联------2019-10-31

刂艹亻的博客
刂艹亻的博客原创
2019年10月31日 14:46:12619浏览

错误处理---自定义错误信息

自定义错误信息:

引入Exception类和扩展Exception类的errorInfo()方法


实例

<?php
//处理运行中的错误
namespace _1012_3;

//异常错误处理
//异常经行错误的统一处理
//异常类是php中专用与错误,信息的同一处理
use Exception;

//将系统的异常类进行自定义扩展
class ClaException extends Exception
{
    public function __construct($message = "", $code = 0)
    {
        parent::__construct($message, $code);
    }

    //自定义错误信息
    public function errorInfo()
    {
        //heredoc: 用来输出大段的html代码或字符中, 并且中间允许有变量且会解析
        return <<< "ERROR"
<h2>
<strong>{$this->getCode()}: </strong>
<span style="color: red;">{$this->getMessage()}</span>
</h2>
ERROR;

    }
}
//如果程序出现错误,则执行catch{中的代码}


try {
//完成算数四则运算
    class Calculator
    {
        //操作符
        protected $defaultOperators = ['+', '-', '*', '/', '%'];
        //结果
        protected $result;

        //构造方法
        public function __construct(...$operators)
        {
            //判断操作符是否在有效的范围内(其实这步可以不要)
            foreach ($operators as $operator) {
                if (in_array($operator, $this->defaultOperators)) {
                    continue;
                } else {
//                die("操作符错误");
                    //Exception(‘提示信息’,自定义错误码)
                    throw new ClaException("操作错误", 101);
                }
            }
            //更新当前的操作符列表
            $this->defaultOperators = $operators;
        }

        //运算方法
        public function operation($type, ...$args)
        {
            //判断操作符的合法性
            if (in_array($type, $this->defaultOperators)) {
                //参数的个数
                $num = count($args);
                switch ($num) {
                    case 0:
//                    die("参数不能为空");
                        throw new ClaException('参数不能为空', 102);
                        break;
                    case $num < 2:
//                    die("参数不能少于2个");
                        throw new ClaException('参数不能少于2个', 103);
                        break;
                    default:
                        $this->result = array_shift($args);
                        if (is_numeric($this->result)) {
                            $this->ececute($type, ...$args);
                        } else {
//                        die("第一个参数必须是数值型");
                            throw new ClaException('第一个参数必须是数值型', 104);
                        }
                }
            } else {
//            die("操作符错误");
                throw new ClaException('操作符错误', 105);
            }
            //返回结果,保留两位小数
            return round($this->result, 2);
        }

        //运算+结果
        public function ececute($type, ...$args)
        {
            //遍历传入参数
            foreach ($args as $arg) {
                //如果第二个传入的参数是数字类型
                if (is_numeric($arg)) {
                    //根据类型来判断运算类型
                    switch ($type) {
                        case '+':
                            $this->result += $arg;
                            break;
                        case '-':
                            $this->result -= $arg;
                            break;
                        case '*':
                            $this->result *= $arg;
                            break;
                        case '/':
                            if ($arg !== 0) {
                                $this->result /= $arg;
                            } else {
//                            die("除数不能等于0");
                                throw new ClaException('除数不能为零', 106);
                            }
                            $this->result += $arg;
                            break;
                        case '%':
                            $this->result %= $arg;
                            break;
                    }
                } else {
//                die("操作数据类型错误");
                    throw new ClaException('操作数类型错误', 107);
                }
            }
        }
    }

//调用类
    $calculator = new Calculator('+', '-', '*', '/', '%');
    echo $calculator->operation('.', 35, 35);
    echo '<br>';
    echo $calculator->operation('*', 45.234, 12.123);
    echo '<br>';
    echo $calculator->operation('/', 45, 12.67);
} catch (ClaException $e){
    echo $e->errorInfo();
    echo '<br>';
    echo $e->getCode(), ':   ' , $e->getMessage();
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

文件上传的操作

实例

<?php
// 将系统的异常类进行扩展,自定义
class ClaException extends Exception
{
    public function __construct($message = "", $code = 0)
    {
        parent::__construct($message, $code);
    }

    //自定义错误信息
    public function errorInfo()
    {
        //heredoc: 用来输出大段的html代码或字符中, 并且中间允许有变量且会解析
        return <<< "ERROR"
<h2>
<strong>{$this->getCode()}: </strong>
<span style="color: red;">{$this->getMessage()}</span>
</h2>
ERROR;

    }
}
// 文件上传
try {
// PHP使用一个超全局变量:$_FILES 来处理文件上传

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

// 设置允许上传的文件最大长度
    $fileSize = 3145728;
// 上传到服务器上的指定的目录
    $filePath = '/uploads/';

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

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


// 2. 判断文件是否上传成功?
//$_FILES['my_file']['error'], 0: 表示成功,大于1出错
    $uploadError = $_FILES['my_file']['error'];
    if ($uploadError > 0) {
        switch ($uploadError) {
            case 1:
            case 2:
                throw new ClaException('上传文档不允许超过3M', 101);
            case 3:
                throw new ClaException('上传文件不完整', 102);
            case 4:
                throw new ClaException('没有文件被上传', 103);
            default:
                throw new ClaException('未知错误', 104);
        }
    }


// 3. 判断文件扩展名是否正确?
//girl.jpg

//['girl', 'jpg']

    $extension = explode('.', $fileName)[1];
    if (!in_array($extension, $fileType)) {
        throw new ClaException('不允许上传'.$extension.'文件类型',105);
    }

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

// 5. 上传文件
    if (is_uploaded_file($tempFile)) {
        if (move_uploaded_file($tempFile, __DIR__ . $filePath . $fileName)) {
            echo '<script>alert("上传成功");history.back();</script>';
        } else {
            throw new ClaException('文件无法移动到指定目录, 请检查目录权限', 106);
        }
    } else {
        throw new ClaException('非法操作', 107);
    }
} catch (ClaException $e){
    echo $e->errorInfo();
}
exit();

运行实例 »

点击 "运行实例" 按钮查看在线实例

模型关联

实例

<?php
//框架中的模型通常是与一张表进行关联的
//实现的类到数据表的映射
namespace _1012_5;

use PDO;

//类名与表明要对应
class Staff
{
    //属性与表中的字段对应
    private $staff_id;
    private $name;
    private $age;
    private $sex;
    private $position;
    private $mobile;
    private $hiredate;

    //属性重载
    public function __get($name)
    {
        // TODO: Implement __get() method.
        return $this->$name;
    }

    public function __set($name, $value)
    {
        // TODO: Implement __set() method.
        $this->$name = $value;
    }

    //构造方法
    public function __construct()
    {
        $this->hiredate = date('Y/m/d',$this->hiredate);
        $this->sex = $this->sex? '男':'女';
    }
}
//连接数据库
$pdo = new PDO('mysql:dbname=chen', 'root', 'root');
//创建预处理语句
$stmt = $pdo->prepare('SELECT * FROM `staff`');
//将此表的数据绑定到STAFF对象中
$stmt->setFetchMode(PDO::FETCH_CLASS,Staff::class);
//执行sql
$stmt->execute();
//var_dump($staff = $stmt->fetch());这时获得的结果,就是个对象,而不是数组
while ($staff = $stmt->fetch()){
    echo"<li>{$staff->staff_id}:{$staff->name}--{$staff->age}--{$staff->sex}--{$staff->hiredate}</li>";
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议