Correction status:qualified
Teacher's comments:完成的不错
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>'; }
运行结果:
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"; ?>
运行结果:
总结:
1、在自定义错误类的时候需要从系统Exception类进行继承,并且子类只能改写父类的__construct()构造方法和errorInfo()方法;不能修改其他方法,在错误接收时,父类Exception可以接收子类抛出的错误内容和样式。
2、类绑定数据表需要根据数据表字段来设置类的属性,在查询的时候,查询结果可以直接调用类的属性来输出想要的数据,查询的时候不需要设置字段,可以再输出的时候在根据自己想要的结果输出;在增加、修改和删除数据方面和未绑定数据表的类相比好像没有优势。