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

PHP小案例:分页实现,文件上传,链式数据库查询构造器

程序员文章站 2023-12-24 11:36:57
...

PHP小案例:分页实现,文件上传,链式数据库查询构造器

原生分页实现

首先准备好数据

创建数据库yourdbname

创建文件mj_course_lists.sql,随后导入数据库

  1. -- phpMyAdmin SQL Dump
  2. -- version 5.1.1
  3. -- https://www.phpmyadmin.net/
  4. --
  5. -- 主机: 127.0.0.1:3306
  6. -- 生成日期: 2022-02-21 15:38:44
  7. -- 服务器版本: 5.7.36
  8. -- PHP 版本: 7.4.26
  9. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  10. START TRANSACTION;
  11. SET time_zone = "+00:00";
  12. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  13. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  14. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  15. /*!40101 SET NAMES utf8mb4 */;
  16. --
  17. -- 数据库: `phpcn`
  18. --
  19. -- --------------------------------------------------------
  20. --
  21. -- 表的结构 `mj_course_lists`
  22. --
  23. DROP TABLE IF EXISTS `mj_course_lists`;
  24. CREATE TABLE IF NOT EXISTS `mj_course_lists` (
  25. `cou_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键 课程ID',
  26. `cat_fid` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '分类父ID',
  27. `cat_id` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '分类ID',
  28. `title` varchar(300) NOT NULL COMMENT '课程标题',
  29. `pic` varchar(200) DEFAULT NULL COMMENT '课程封面图',
  30. `info` varchar(500) DEFAULT NULL COMMENT '课程介绍',
  31. `status` tinyint(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '状态 1开启 0关闭',
  32. `sort` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序',
  33. `type` tinyint(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '课程类型:1录播 2直播',
  34. `money` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '金额',
  35. `uid` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '授课老师(发布人)',
  36. `add_time` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '添加时间',
  37. PRIMARY KEY (`cou_id`) USING BTREE
  38. ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COMMENT='课程表' ROW_FORMAT=DYNAMIC;
  39. --
  40. -- 转存表中的数据 `mj_course_lists`
  41. --
  42. INSERT INTO `mj_course_lists` (`cou_id`, `cat_fid`, `cat_id`, `title`, `pic`, `info`, `status`, `sort`, `type`, `money`, `uid`, `add_time`) VALUES
  43. (1, 13, 14, '第十八期_PHP编程', 'https://img.php.cn/upload/course/000/000/015/61a0ab335a764963.jpg', '零基础开始,能解决常规业务逻辑,PHP操作MySQL增删改查,动态网站数据展示,深刻理解MVC框架,达到学习和灵活掌握PHP开发涉及到的各个知识点。', 1, 0, 2, 0, 3, 1644321600),
  44. (2, 13, 14, '第十八期_综合实战', 'https://img.php.cn/upload/course/000/000/015/61a0ab3d9520d816.jpg', '综合实战,包含Ant Design Vue组件库与Ant Design Pro (admin)后台管理、真实项目上线流程、ThinkPHP6实现API接口开发、短信验证、支付系统开发...,巩固一二阶段学习成果,达到前端和PHP核心知识点的灵活运用,实训完成自己的项目,并指导上线!', 1, 0, 2, 0, 1, 1644321600),
  45. (3, 13, 14, '公益直播 | 基于TP6的门店排号系统', 'https://img.php.cn/upload/course/000/000/015/619c846558257945.jpg', '涉及技术:php、html、css、javascript。所用框架:ThinkPHP、Layui。功能一:奶茶排号系统。流程:1、选择商品、下单;2、生成单号、排队号;3、打印小票;4、取商品。功能二:饭店排号系统。流程:1、生成单号、排队号;2、打印小票;3、用餐、过号;4、上桌、吃饭。', 1, 0, 2, 0, 1, 1644321600),
  46. (4, 13, 14, '通用后台管理系统实战开发(Thinkphp6+Layui)', 'https://img.php.cn/upload/course/000/000/015/61500a97859e7795.jpg', '使用thinkphp6和layui 搭建的一套后台管理系统,属于实战进阶课程', 1, 0, 1, 0, 1, 1644321600),
  47. (5, 13, 14, 'Thinkphp6.0正式版视频教程', 'https://img.php.cn/upload/course/000/000/015/61adbdb9912b0589.png', 'Thinkphp6.0从2019年10月24日正式发布,相对测试版,有很多变动,目前TP6已经相对比较稳定了,所以在2020年再次重新录制课程,帮助快速入门!相关推荐: ThinkPHP6.0完全开发手册(注解版) https://www.php.cn/course/1049.html', 1, 0, 1, 0, 1, 1644321600),
  48. (6, 13, 14, 'php8,我来也', 'https://img.php.cn/upload/course/000/000/013/6049da2b3898c385.jpg', '从实战中学习php基础知识,让你知道每个php知识点,在实战怎么运用。 新方式讲解新版本,php8不一样的未来。', 1, 0, 1, 0, 1, 1644321600),
  49. (7, 13, 14, 'Uniapp简爱读书项目开发--第一季', 'https://img.php.cn/upload/course/000/000/048/6101014ce7756479.jpg', '本课程采用前后端完全分离的方式开发简爱阅读项目, 前端采用当下流行的一套代码多端应用的uniapp框架,后端使用thinkphp6.0提供接口数据并部署到线上(宝塔)。学习本课程,你需要具备一定的uniapp基础,比如条件编译,微信登录,网络请求,本地缓存,组件化开发等。除此之外, 你还需要具备一定的thinkphp基础, 如路由注册,跨域处理,文件上传配置,数据库查询等...', 1, 0, 1, 0, 3, 1644321600),
  50. (8, 26, 27, 'MySQL从菜鸟到大牛(基础/高级/优化)', 'https://img.php.cn/upload/course/000/000/041/62023529bdb44439.jpg', 'MySQL课程天花板:6大范式讲解、7大日志剖析、7大SQL性能分析工具、9大存储引擎剖析、10大类30小类优化场景、15个不同锁的应用讲解、18种创建索引的规则、300+张高清无码技术剖析图......', 1, 0, 1, 0, 5, 1644321600),
  51. (9, 1, 7, 'TypeScript入门视频【不学JavaScript也能看得懂】', 'https://img.php.cn/upload/course/000/000/041/61f353035c71e348.jpg', 'TypeScript 是微软新推出的一种语言,基于 JavaScript,是 JavaScript 的超集,最终通过工具编译生成 JavaScript。TypeScript 兼容JavaScript,可以载入 JavaScript 代码然后运行。', 1, 0, 1, 0, 5, 1644321600),
  52. (10, 1, 10, 'Node.js全套入门教程', 'https://img.php.cn/upload/course/000/000/041/61efbf20b5e84100.jpg', '本套课程作为框架前置课,重点为学生铺垫 npm、包、模块化、身份认证、CORS 跨域等主要知识点,为学习后面的 Vue 课程夯实基础。同时,本课程涵盖了 MySQL 数据库、API 接口项目开发等后端内容,拓宽了学生的知识面,为前端学生构建了前后端完整的知识体系,助力学生更好地发展。', 1, 0, 1, 0, 5, 1644321600),
  53. (11, 13, 14, '细说PHP(2021版)第一季', 'https://img.php.cn/upload/course/000/000/064/60b4860da91fe302.jpg', '本套课程为经典畅销书<细说PHP>为参考录制,行业大牛精心录制,割肝分享,不论是初学者,还是有一定基础的开发者,都能从这套课程中,找到短板,迅速提升技能', 1, 0, 1, 0, 5, 1644321600),
  54. (12, 13, 14, 'vue 3.0全新实战课程(2021版)第一季', 'https://img.php.cn/upload/course/000/000/015/60eea6b44251e307.png', 'Vue.js是非常流行的一个前端开发框架,采用渐进式底层向上开发模式,使用了主流的MVVM设计框架。本课以Vue.js开发的核心理念与常用技术为背景,让您在最短的时间内理解并掌握Vue.js框架的核心知识,为进一步深造打下良好的基础。', 1, 0, 1, 0, 5, 1644321600),
  55. (13, 13, 14, 'PHP实战天龙八部之仿爱奇艺电影网站', 'https://img.php.cn/upload/course/000/000/001/5d2426f409839992.jpg', '本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程', 1, 0, 1, 0, 5, 1644321600),
  56. (14, 1, 2, '[公益直播]Web前端开发极速入门', 'https://img.php.cn/upload/course/000/000/041/61b32731a6b84725.jpg', '1.课程名称:[小米商城官网]首页的快速搭建 2.学习内容: (1)HTML常用标签的使用技巧; (2)CSS元素样式控制与网站布局的技巧; (3)大型商业网站前端页面的搭建流程; (4)HTML+CSS综合运用与经验分享。', 1, 0, 2, 0, 5, 1644321600),
  57. (15, 13, 14, 'PHP实战天龙八部之微信支付视频教程', 'https://img.php.cn/upload/course/000/000/001/5d242759adb88970.jpg', '微信支付是当前最流行的支付方式之一,本课程较详细的介绍了如何接入微信支付SDK,以及在公司实际开发中的要注意的问题', 1, 0, 1, 0, 4, 1644321600),
  58. (16, 13, 14, '在线报名系统(移动端)实战【公益直播】', 'https://img.php.cn/upload/course/000/000/001/6072932baeb4e177.png', '大型公益课,2021.4.12号晚上20:00开始,连续5晚,全程直播,一起开发一个中小学兴趣班报名系统! 后端使用Thinkphp6开发,前端页面使用bootstrap3,欢迎参与互动!', 1, 0, 2, 0, 1, 1644321600),
  59. (17, 0, 0, 'CI框架30分钟极速入门', 'https://img.php.cn/upload/course/000/000/041/61b83b7bb3b9c356.jpg', 'CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。', 1, 0, 1, 0, 5, 1644321600),
  60. (18, 13, 14, '[公益直播]PHP实战开发极速入门', 'https://img.php.cn/upload/course/000/000/035/5d27fb58823dc974.jpg', '课程名称: PHP快速创建[小型商业论坛] 适合掌握了基本的前端常识与PHP基本语法,但不知如何开发一个实用项目的朋友', 1, 0, 2, 0, 5, 1644321600),
  61. (19, 13, 14, '大型公益实战天龙八部之开发Mini版MVC框架仿糗事百科网站', 'https://img.php.cn/upload/course/000/000/001/5d24230536122573.jpg', '通过开发Mini版MVC框架,理解现有流行的MVC框架如ThinkPHP、CI框架的底层运行原理,仿糗事百科网站让大家大概了解一个应用的总体开发流程', 1, 0, 1, 0, 5, 1644321600),
  62. (20, 13, 14, 'php mysql实战:学生信息管理系统(玉女心经版)', 'https://img.php.cn/upload/course/000/000/015/5f4480bb6936a963.png', '本章课程不使用PHP任何后端框架,写一套简单的学生信息管理系统,对学生信息的增删查改。不使用框架的目的是为了更深层次地理解前后端数据的交互过程,更加熟悉SQL查询语句的使用,以及会话跟踪session的原生使用等。', 1, 0, 1, 0, 5, 1644321600),
  63. (21, 1, 2, '2018前端入门_HTML5', 'https://img.php.cn/upload/course/000/126/153/5aa23f0ded921649.jpg', '《玉女心经系列:2018前端入门_HTML5》,原创免费自学课程,非常适合HTML5零基础入门,整个轻松明快,简洁生动,让你快速走入HTML5的世界,体会语义化开发的魅力!', 1, 0, 1, 0, 3, 1644321600),
  64. (22, 1, 7, 'JavaScript极速入门_玉女心经系列', 'https://img.php.cn/upload/course/000/126/153/5acc118f11d6b969.jpg', 'JavaScript能够称得上是史上使用最广泛的编程语言,也是前端开发必须掌握的三技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。本章节将帮助大家迅速掌握JavaScript这门高端的、动态的、弱类型编程语言。知识点简单明了,让你学习0压力,适合新手观看学习......', 1, 0, 1, 0, 3, 1644321600),
  65. (23, 1, 3, 'CSS视频教程-玉女心经版', 'https://img.php.cn/upload/course/000/126/153/5ab346fc62ce4221.jpg', 'CSS教程之《CSS视频教程-玉女心经版》为原创视频教程。html和css是组成WEB前端开发最核心的部分,所以结合之前的html课程,我们再来学习本章节的css,将会获得更好的体验。课程内容非常有节奏的安排,知识点简单明了,让你从头到尾学习毫无压力。本章节讲解的是有关CSS基础的内容,轻松明快,适合新手观看学习。', 1, 0, 1, 0, 3, 1644321600),
  66. (24, 1, 1, '30分钟学会网站布局', 'https://img.php.cn/upload/course/000/000/041/61b8365849424887.jpg', '1.单列布局 2.两列布局 3.三列布局', 1, 0, 1, 0, 5, 1644321600),
  67. (25, 13, 14, '独孤九贱(5)_ThinkPHP5视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6e053065c808.jpg', 'ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将您在开发要用到的所有知识点,娓娓道来。语言选简洁明快,实例简单实用,只你具备基本的PHP的语法常识,就可以跟着PHP中文网的这套原创课程,学会用ThinkPHP5创建您的项目。从用户请求到响应输出,从控制器到路由,从模型知识到模板调试,在本套课程中,你总可以找到你的最爱。', 1, 0, 1, 0, 4, 1644321600),
  68. (26, 1, 4, '独孤九贱(1)_HTML5视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6ddbecdb1707.jpg', '《php.cn原创html5视频教程》课程特色:原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 每节课内容精炼,长度不超过10分钟,非常适合您利用碎片时间来学习。地铁上、等人、候车、餐厅无处不学习~~', 1, 0, 1, 0, 4, 1644321600),
  69. (27, 1, 8, '独孤九贱(6)_jQuery视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6e0d2b744633.jpg', 'jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制', 1, 0, 1, 0, 5, 1644321600),
  70. (28, 1, 6, '独孤九贱(7)_Bootstrap视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6e1577037989.jpg', 'Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。为所有开发者、所有应用场景而设计,它让前端开发更快速、简单,所有开发者都能快速上手、所有设备都可以适配、所有项目都适用!Bootstrap 还是完全开源的,它的代码托管、开发、维护都依赖 GitHub 平台。PHP中文网推出的Bootstrap系列课程,适合于前端开发者入门学习参考~~', 1, 0, 1, 0, 4, 1644321600),
  71. (29, 1, 3, '独孤九贱(2)_CSS视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6de7424b9255.jpg', '《php.cn独孤九贱(2)-css视频教程》课程特色:原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了CSS知识。 每节课内容精炼,长度不超过10分钟,非常适合您利用碎片时间来学习。地铁上、等人、候车、餐厅无处不学习~~', 1, 0, 1, 0, 4, 1644321600),
  72. (30, 1, 7, '独孤九贱(3)_JavaScript视频教程', 'https://img.php.cn/upload/course/000/000/001/5d1c6df423564706.jpg', 'javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。没有它,你的前端生涯是不完整的。《php.cn独孤九贱(3)-JavaScript视频教程》课程特色:原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了javascript知识。', 1, 0, 1, 0, 4, 1644321600);
  73. COMMIT;
  74. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  75. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  76. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

创建index.php

  1. <?php require "pagedata.php"; ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <link rel="stylesheet" href="index.css">
  9. <title>Document</title>
  10. </head>
  11. <body>
  12. <table>
  13. <caption>课程信息表</caption>
  14. <thead>
  15. <tr>
  16. <td>编号</td>
  17. <td>名称</td>
  18. <td>封面</td>
  19. <td>课程简介</td>
  20. <td>创建时间</td>
  21. <td>操作</td>
  22. </tr>
  23. </thead>
  24. <tbody>
  25. <?php foreach ($lists as $list) : ?>
  26. <tr>
  27. <td><?= $list['cou_id'] ?></td>
  28. <td><?= $list['title'] ?></td>
  29. <td><img style="width:100px" src=" <?= $list['pic'] ?>" alt="课程封面"></td>
  30. <td><?= $list['info'] ?></td>
  31. <td><?= date("Y-m-d H:m:s", $list['add_time']) ?></td>
  32. <td><button>删除</button><button>编辑</button></td>
  33. </tr>
  34. <?php endforeach; ?>
  35. </tbody>
  36. </table>
  37. <!-- 生成分页按钮 -->
  38. <p>
  39. <?php for ($i = 1; $i <= $pages; $i++) : ?>
  40. <?php $jump = sprintf('?page=%d', $i) ?>
  41. <?php $active = ($i == $page) ? 'active' : '' ?>
  42. <!-- 高亮显示选中页 -->
  43. <a class="<?= $active ?>" href="<?= $jump ?>"><?= $i ?></a>
  44. <?php endfor ?>
  45. </p>
  46. </body>
  47. </html>

创建处理数据的pagedata.php

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;charset=utf8;port=3306;dbname=phpcn', 'root', '', [PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
  3. // 每页的数据量
  4. $pageSize = 6;
  5. // 当前访问的是第几页
  6. $page = $_GET['page'] ?? 1;
  7. // 偏移量offset
  8. $offset = ($page - 1) * $pageSize;
  9. $sql = "SELECT `cou_id`,`title`,`pic`,`info`,`add_time`FROM `mj_course_lists` ORDER BY `cou_id` DESC LIMIT {$offset},{$pageSize}";
  10. $lists = $pdo->query($sql)->fetchAll();
  11. // 获取总页数
  12. $sql1 = "SELECT COUNT(`cou_id`) AS `sum` FROM `mj_course_lists`";
  13. $total = $pdo->query($sql1)->fetch()['sum'];
  14. // var_dump($total);
  15. //总页数
  16. $pages = ceil($total / $pageSize);
  17. // var_dump($pages);
  18. //var_dump($lists);

PHP文件上传

php 关于文件上传的配置

文件上传项目项在php.ini中设置,常用的配置项有:

序号 配置项 默认值 描述
1 file_uploads On 使 PHP 支持文件上传
2 upload_tmp_dir /tmp 设置上传文件的暂存区位置
3 max_file_uploads 20 单次请求时允许上传的最大文件数量
4 max_execution_time 30 设置脚本被解析器终止之前PHP最长执行时间(秒) ,防止服务器资源被耗尽
5 max_input_time 60 设置 PHP 通过 POST/GET/PUT 解析接收数据的时长(秒)
6 memory_limit 128M 设置脚本能够分配的最大内存容量 单位字节 1M等于1024K,一兆等于1048576字节
7 post_max_size 8M 设置通过 POST方法提交的数据量上限
8 upload_max_filesize 2M 设置上传的单个文件的数据量上限

memory_limit >= post_max_size 防止失控的脚本独占服务器内存,严重时使服务器崩溃
post_max_size > upload_max_filesize 因为后者只是限制通过file输入类型传递过来的数据量,不像post_max_size可以限制所有通过post方法上传的数据量上限

$_FILE

  • 上传文件的描述信息,全部保存在系统全局变量$_FILES
  • $_FILES以二维数组形式保存: $_FILES['form_file_name']['key']
  • 'form_file_name': 对应着表单中<input type="file" name="my_pic">name属性值
  • 'key': 共有 5 个键名, 描述如下:
序号 键名 描述
1 name 文件在客户端的原始文件名(即存在用户电脑上的文件名)
2 type 文件的 MIME 类型, 由浏览器提供, PHP 并不检查它
3 tmp_name 文件被上传到服务器上之后,在临时目录中显示的临时文件名
4 error 和该文件上传相关的错误代码
5 size 已上传文件在客户端机器上的实际大小(单位为字节)

创建index.php

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>文件上传</title>
  8. </head>
  9. <body>
  10. <!-- application/x-www-urlencoded 不合适二进制数据或者包含ASCII字符的传输 -->
  11. <form action="doupload.php" method="post" enctype="multipart/form-data">
  12. <label for="avatar">头像</label>
  13. <input type="file" name="avatar" id="avatar">
  14. <button>提交</button>
  15. </form>
  16. </body>
  17. </html>

创建doupload.php

  1. <?php
  2. // 获取文件信息$_FILES
  3. //var_dump($_FILES);
  4. $originalFilename = $_FILES['avatar']['name'];
  5. $type = $_FILES['avatar']['type'];
  6. $tmp_name = $_FILES['avatar']['tmp_name'];
  7. $error = $_FILES['avatar']['error'];
  8. $size = $_FILES['avatar']['size'];
  9. $arr = explode('.', $originalFilename);
  10. $ext = end($arr); //获取文件后缀
  11. // 检查文件格式mine
  12. $exts = ['png', 'jpg', 'jpeg', 'wbmp', 'gif'];
  13. if (!in_array($ext, $exts)) {
  14. echo "<p style='color:red;font-size:20px;'>非法的文件类型</p>";
  15. return;
  16. }
  17. // 检查大小
  18. if($size > 307200){
  19. echo "<p>$originalFilename</p><p style='color:red;font-size:20px;'>文件过大</p>";
  20. return;
  21. }
  22. // `is_uploaded_file()` | 用来检测文件是否是通过http post方法上传的,而不是系统上的一个文件。作用是防止潜在攻击者通过问题脚本访问并非用于交互的文件
  23. if(is_uploaded_file($originalFilename))
  24. {
  25. echo ("$originalFilename is uploaded via HTTP POST");
  26. }
  27. else
  28. {
  29. echo ("$originalFilename is not uploaded via HTTP POST");
  30. }
  31. if ($error == 0) {
  32. //移动暂存区的图片到服务器指定的文件目录
  33. $des = 'storage/';
  34. if (!file_exists($des)) {
  35. mkdir($des, 0777, true);
  36. }
  37. // 为了确保同一秒钟两个用户上传的图片名称相同情况下,文件都能上传成功
  38. $prefix = array_shift($arr);
  39. $newName = date('YmdHms', time()) . md5($prefix) . time() . '.' . $ext;
  40. move_uploaded_file($tmp_name, $des . $newName);
  41. }
  42. switch ($error):
  43. case 0:
  44. echo '<p style="color:green">文件上传成功</p> ';
  45. echo "原始文件名称$originalFilename";
  46. echo "文件大小$size";
  47. break;
  48. case 1:
  49. echo '<p style="color:red">文件超过`php.ini`中`upload_max_filesize`值</p>';
  50. break;
  51. case 2:
  52. echo '<p style="color:red">文件大小超过表单中`MAX_FILE_SIZE`指定的值</p>';
  53. break;
  54. case 3:
  55. echo '<p style="color:red">文件只有部分被上传</p>';
  56. break;
  57. case 4:
  58. echo '<p style="color:red">没有文件被上传</p>';
  59. break;
  60. case 6:
  61. echo '<p style="color:red">找不到临时文件夹</p>';
  62. break;
  63. case 6:
  64. echo '<p style="color:red">文件写入失败</p>';
  65. break;
  66. default:
  67. echo '<p style="color:red">系统错误</p>';
  68. break;
  69. endswitch;

PHP链式数据库查询构造器

委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。这类似于继承,和在子类中调用父类的方法有点儿相似。

但在继承时,父类与子类的关系是固定的,而使用委托则可以在代码运行时改变使用的对象,这意味着委托比继承具有更大的灵活性。

事件委托:访问类中不存在的成员方法,会被魔术方法拦截,将请求重定向给或者委托给别的对象成员方法类处理。 委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。委托比继承更加灵活 父类与子类的关系是固定的,只能单继承,但是请求可以委托给多个对象

  1. <?php
  2. //被委托的类,数据库查询构造器
  3. class Query
  4. {
  5. //创建pdo对象的唯一实例
  6. private static $db;
  7. protected $table;
  8. protected $field;
  9. protected $limit;
  10. // private私有的 阻止此类在外部进行实例化
  11. private function __construct()
  12. {
  13. }
  14. static function connect($dsn, $user, $pwd)
  15. {
  16. if (is_null(static::$db)) {
  17. static::$db = new pdo($dsn, $user, $pwd);
  18. }
  19. // return static::$db;
  20. // 返回query实例
  21. return new static;
  22. }
  23. public function table($table)
  24. {
  25. $this->table = $table;
  26. return $this; //返回本对象 为了实现链式调用
  27. }
  28. public function where($where)
  29. {
  30. }
  31. public function field($field)
  32. {
  33. $this->field = $field;
  34. return $this;
  35. }
  36. public function limit($limit)
  37. {
  38. $this->limit = $limit;
  39. return $this;
  40. }
  41. public function getSql()
  42. {
  43. return sprintf('SELECT %s FROM %s LIMIT %d ', $this->field, $this->table, $this->limit);
  44. }
  45. public function select()
  46. {
  47. return static::$db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);
  48. }
  49. }
  50. // 委托方
  51. class Db
  52. {
  53. static function __callStatic($name, $arguments)
  54. {
  55. $dsn = 'mysql:host=localhost;dbname=phpcn;charset=utf8;port=3306';
  56. $user = 'root';
  57. $pwd = '';
  58. // 获取到被委托的类Query实例
  59. $q = Query::connect($dsn, $user, $pwd);
  60. return call_user_func([$q, $name], ...$arguments);
  61. }
  62. }
  63. $res = Db::table('mj_course_cat')->field('cat_id,name')->limit(20)->select();
  64. var_dump($res);

上一篇:

下一篇: