博客列表 >异常处理+文件上传+模型类映射

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

小星的博客
小星的博客原创
2019年12月08日 22:43:33860浏览

异常处理

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');

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