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

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

xiablog
xiablog原创
2022年02月22日 00:09:10728浏览

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已经相对比较稳定了,所以php中文网在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》,php中文网原创免费自学课程,非常适合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视频教程-玉女心经版》为php中文网原创视频教程。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中文网原创幽默段子系列课程,以恶搞,段子为主题风格的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中文网原创幽默段子系列课程,以恶搞,段子为主题风格的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中文网原创幽默段子系列课程,以恶搞,段子为主题风格的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);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议