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

异常处理+文件上传+模型类映射

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

异常处理

php 中使用 Exception 类来管理异常
官网截图:异常处理+文件上传+模型类映射
可以看到 只有 __construct() 方法和 __toString()方法可以被子类继承重载
异常处理一般结合 try-catch语法使用,一下为简单实例:

  1. try {
  2. $errorInfo = '遇到错误';
  3. throw new Exception($errorInfo, 0); // 手动抛出异常,后面语句不会执行
  4. echo '测试语句';
  5. }catch(Exception $e){ // 这里会接收异常对象
  6. print_r($e->getMessage()); // 遇到错误
  7. print_r($e->getCode()); // 0
  8. }

文件上传

PHP中使用全局变量 $_FILES 来处理文件上传
** $_FILES 为一个数组,保存着文件上传的信息,打印一下可以看到保存着5中信息。
异常处理+文件上传+模型类映射

这里要注意的是:PHP上传文件时会将文件上传至一个临时位置,需要再次移动该临时文件至指定目录。
这里我们将异常处理和文件上传结合一下写一个例子

先建个表单文件 upload.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文件上传</title>
  6. </head>
  7. <body>
  8. <form action="deal.php" method="POST" enctype="multipart/form-data">
  9. <!--设置一个隐藏域,限制上传文件大小-->
  10. <input type="hidden" name="MAX_FILE_SIZE" value="20000">
  11. <input type="file" name="file1">
  12. <button>上传</button>
  13. </form>
  14. </body>
  15. </html>

在建个处理文件 deal.php

  1. <?php
  2. /**
  3. * 文件上传
  4. */
  5. namespace day1012;
  6. use Exception;
  7. // 自定义异常类
  8. class MyException extends Exception
  9. {
  10. public function __construct($message = "", $code = 0)
  11. {
  12. parent::__construct($message, $code);
  13. }
  14. public function errorInfo(){
  15. return <<<ERROR
  16. <h3 style="font-weight:bold; line-height: 30px">
  17. <img src="./warn-ico.png" width="30" height="30" style="float: left; margin-top: 15px" />
  18. <p style="margin: 0 0 0 40px">出现异常,异常编号:<em style="color: red">{$this->getCode()}</em> </p>
  19. <p style="margin: 0 0 0 40px">异常信息:<em style="color: red">{$this->getMessage()}</em></p>
  20. </h3>
  21. ERROR;
  22. }
  23. }
  24. try {
  25. // PHP中使用全局变量 $FILES 来处理文件上传
  26. print_r($_FILES);
  27. // 1. 设定上传文件限定类型
  28. $fileType = ['jpg', 'png'];
  29. // 2.设置允许上传文件大小
  30. $fileSize = 250000;
  31. // 3. 设置文件目录
  32. $path = './uploads/';
  33. // 文件名称
  34. $fileName = $_FILES['file1']['name'];
  35. // 临时文件名称
  36. $tmpName = $_FILES['file1']['tmp_name'];
  37. // 4. 判断文件是否上传成功,错误类型 0:成功,大于1 出错
  38. if ($_FILES['file1']['error'] > 0) {
  39. switch ($_FILES['file1']['error']) {
  40. case 1:
  41. throw new MyException('文件大小超出PHP配置文件限制',101);
  42. case 2:
  43. throw new MyException('文件大小超出表单限定值',102);
  44. case 3:
  45. throw new MyException('文件只有部分被上传',103);
  46. case 4:
  47. throw new MyException('没有上传任何文件',104);
  48. default :
  49. throw new MyException('未知错误',105);
  50. }
  51. }
  52. // 5. 判断文件类型是否为允许类型
  53. $type = explode('.', $fileName)[1];
  54. if (!in_array($type, $fileType)) {
  55. throw new MyException('不允许上传' . $type . '类型文件',106);
  56. }
  57. // 6. 判断文件是否超出限定值大小
  58. if ($_FILES['file1']['size'] > $fileSize) {
  59. throw new MyException('超出大小限制,请重新上传',107);
  60. }
  61. // 7. 设置新的文件名,注意别忘了加后缀名
  62. $newName = date('YmdHis') . rand(100, 999) . '.' . $type;
  63. if (is_uploaded_file($tmpName)) {
  64. if (!move_uploaded_file($tmpName, __DIR__ . $path . $newName)) {
  65. throw new MyException('移动文件失败',888);
  66. } else {
  67. echo '<script>alert("恭喜上传成功");window.history.back();</script>';
  68. }
  69. } else {
  70. throw new MyException('上传文件不是合法文件',999);
  71. }
  72. }catch(MyException $e){
  73. print_r($e->errorInfo());
  74. }

一些结果截图:
异常处理+文件上传+模型类映射
异常处理+文件上传+模型类映射

模型类与数据表绑定

这里绑定 staff 表,因此建立一个 Staff类

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <link rel="stylesheet" href="table.css">
  6. </head>
  7. <body>
  8. <div>
  9. <?php
  10. class Staff
  11. {
  12. // 先定义属性,用于和表中字段绑定
  13. private $staff_id;
  14. private $name;
  15. private $age;
  16. private $sex;
  17. private $position;
  18. private $mobile;
  19. private $hiredate;
  20. private static $pdo;
  21. public function __construct()
  22. {
  23. // 部分字段初始化
  24. $this->sex = $this->sex ? '男' : '女';
  25. $this->hiredate = date('Y/m/d', $this->hiredate);
  26. }
  27. public function __get($name)
  28. {
  29. return $this->$name;
  30. }
  31. public function __set($name, $value)
  32. {
  33. $this->$name = $value;
  34. }
  35. public static function connect()
  36. {
  37. static::$pdo = new \PDO('mysql:dbname=zmx;', 'root', 'root');
  38. }
  39. // 查询方法
  40. public static function select($where = '')
  41. {
  42. static::connect();
  43. $where = empty($where) ? '' : ' WHERE ' . $where;
  44. $sql = 'SELECT * FROM `staff` ' . $where;
  45. $stmt = static::$pdo->prepare($sql);
  46. // setFetchMode
  47. // 为语句设置默认的获取模式。
  48. // PDO::FETCH_CLASS
  49. // 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。
  50. // 如果所请求的类中不存在该属性,则调用 __set() 魔术方法
  51. // 这里就是将拿到的数据库模型 和 当前 Staff 类进行关联
  52. $stmt->setFetchMode(\PDO::FETCH_CLASS, Staff::class);
  53. if ($stmt->execute()) {
  54. echo '<table border="1" cellpadding="0" cellspacing="0" width="400">';
  55. echo '<tr><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>职位</th><th>联系方式</th><th>入职时间</th></tr>';
  56. while ($staff = $stmt->fetch()) {
  57. echo '<tr>';
  58. echo '<td>' . $staff->staff_id . '</td>';
  59. echo '<td>' . $staff->name . '</td>';
  60. echo '<td>' . $staff->age . '</td>';
  61. echo '<td>' . $staff->sex . '</td>';
  62. echo '<td>' . $staff->position . '</td>';
  63. echo '<td>' . $staff->mobile . '</td>';
  64. echo '<td>' . $staff->hiredate . '</td>';
  65. echo '</tr>';
  66. }
  67. echo '</table>';
  68. }
  69. }
  70. // 增加方法
  71. public static function insert($data)
  72. {
  73. static::connect();
  74. $set = ' SET ';
  75. foreach ($data as $key => $value) {
  76. $set .= $key . ' =:' . $key . ', ';
  77. }
  78. // 去掉最后一个 逗号
  79. $set = rtrim($set, ", ");
  80. $sql = 'INSERT INTO `staff` ' . $set;
  81. $stmt = static::$pdo->prepare($sql);
  82. if ($stmt->execute($data)) {
  83. if ($stmt->rowCount() > 0) {
  84. echo '成功新增了' . $stmt->rowCount() . '条记录,最后一条记录主键为' . static::$pdo->lastInsertId().'<br/>';
  85. }
  86. } else {
  87. die('新增失败:' . print_r($stmt->errorInfo()));
  88. }
  89. }
  90. // 更新方法
  91. public static function update($data,$where){
  92. static::connect();
  93. $where = empty($where) ? '' : ' WHERE ' . $where;
  94. $set = ' SET ';
  95. foreach ($data as $key => $value) {
  96. $set .= $key . ' =:' . $key . ', ';
  97. }
  98. // 去掉最后一个 逗号
  99. $set = rtrim($set, ", ");
  100. $sql = 'UPDATE `staff` ' . $set.$where;
  101. $stmt = static::$pdo->prepare($sql);
  102. if ($stmt->execute($data)) {
  103. if ($stmt->rowCount() > 0) {
  104. echo '成功更新了' . $stmt->rowCount() . '条记录<br/>';
  105. }
  106. } else {
  107. die('更新失败:' . print_r($stmt->errorInfo()));
  108. }
  109. }
  110. // 删除方法
  111. public static function delete($where){
  112. static::connect();
  113. $where = empty($where) ? '' : ' WHERE ' . $where;
  114. $sql = 'DELETE FROM `staff` '.$where;
  115. $stmt = static::$pdo->prepare($sql);
  116. if($stmt->execute()){
  117. if($stmt->rowCount() > 0){
  118. echo '成功删除了'.$stmt->rowCount().'条记录<br/>';
  119. }
  120. }else {
  121. die('查询失败:' . print_r($stmt->errorInfo()));
  122. }
  123. }
  124. }
  125. Staff::select();
  126. Staff::insert(['staff_id'=>20,'name'=>'小明','age'=>20,'sex'=>1,'position'=>'队长','mobile'=>'12345678','hiredate'=>'1218297600']);
  127. Staff::update(['name'=>'小张'],'staff_id=20');
  128. Staff::delete('staff_id=20');

异常处理+文件上传+模型类映射