批改状态:合格
老师批语:
首先准备好数据
创建数据库yourdbname
创建文件mj_course_lists.sql,随后导入数据库
-- phpMyAdmin SQL Dump-- version 5.1.1-- https://www.phpmyadmin.net/---- 主机: 127.0.0.1:3306-- 生成日期: 2022-02-21 15:38:44-- 服务器版本: 5.7.36-- PHP 版本: 7.4.26SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";START TRANSACTION;SET time_zone = "+00:00";/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8mb4 */;---- 数据库: `phpcn`---- ------------------------------------------------------------ 表的结构 `mj_course_lists`--DROP TABLE IF EXISTS `mj_course_lists`;CREATE TABLE IF NOT EXISTS `mj_course_lists` (`cou_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键 课程ID',`cat_fid` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '分类父ID',`cat_id` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '分类ID',`title` varchar(300) NOT NULL COMMENT '课程标题',`pic` varchar(200) DEFAULT NULL COMMENT '课程封面图',`info` varchar(500) DEFAULT NULL COMMENT '课程介绍',`status` tinyint(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '状态 1开启 0关闭',`sort` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序',`type` tinyint(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '课程类型:1录播 2直播',`money` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '金额',`uid` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '授课老师(发布人)',`add_time` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '添加时间',PRIMARY KEY (`cou_id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COMMENT='课程表' ROW_FORMAT=DYNAMIC;---- 转存表中的数据 `mj_course_lists`--INSERT INTO `mj_course_lists` (`cou_id`, `cat_fid`, `cat_id`, `title`, `pic`, `info`, `status`, `sort`, `type`, `money`, `uid`, `add_time`) VALUES(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),(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),(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),(4, 13, 14, '通用后台管理系统实战开发(Thinkphp6+Layui)', 'https://img.php.cn/upload/course/000/000/015/61500a97859e7795.jpg', '使用thinkphp6和layui 搭建的一套后台管理系统,属于实战进阶课程', 1, 0, 1, 0, 1, 1644321600),(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),(6, 13, 14, 'php8,我来也', 'https://img.php.cn/upload/course/000/000/013/6049da2b3898c385.jpg', '从实战中学习php基础知识,让你知道每个php知识点,在实战怎么运用。 新方式讲解新版本,php8不一样的未来。', 1, 0, 1, 0, 1, 1644321600),(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),(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),(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),(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),(11, 13, 14, '细说PHP(2021版)第一季', 'https://img.php.cn/upload/course/000/000/064/60b4860da91fe302.jpg', '本套课程为经典畅销书<细说PHP>为参考录制,行业大牛精心录制,割肝分享,不论是初学者,还是有一定基础的开发者,都能从这套课程中,找到短板,迅速提升技能', 1, 0, 1, 0, 5, 1644321600),(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),(13, 13, 14, 'PHP实战天龙八部之仿爱奇艺电影网站', 'https://img.php.cn/upload/course/000/000/001/5d2426f409839992.jpg', '本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程', 1, 0, 1, 0, 5, 1644321600),(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),(15, 13, 14, 'PHP实战天龙八部之微信支付视频教程', 'https://img.php.cn/upload/course/000/000/001/5d242759adb88970.jpg', '微信支付是当前最流行的支付方式之一,本课程较详细的介绍了如何接入微信支付SDK,以及在公司实际开发中的要注意的问题', 1, 0, 1, 0, 4, 1644321600),(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),(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),(18, 13, 14, '[公益直播]PHP实战开发极速入门', 'https://img.php.cn/upload/course/000/000/035/5d27fb58823dc974.jpg', '课程名称: PHP快速创建[小型商业论坛] 适合掌握了基本的前端常识与PHP基本语法,但不知如何开发一个实用项目的朋友', 1, 0, 2, 0, 5, 1644321600),(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),(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),(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),(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),(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),(24, 1, 1, '30分钟学会网站布局', 'https://img.php.cn/upload/course/000/000/041/61b8365849424887.jpg', '1.单列布局 2.两列布局 3.三列布局', 1, 0, 1, 0, 5, 1644321600),(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),(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),(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),(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),(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),(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);COMMIT;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
创建index.php
<?php require "pagedata.php"; ?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="index.css"><title>Document</title></head><body><table><caption>课程信息表</caption><thead><tr><td>编号</td><td>名称</td><td>封面</td><td>课程简介</td><td>创建时间</td><td>操作</td></tr></thead><tbody><?php foreach ($lists as $list) : ?><tr><td><?= $list['cou_id'] ?></td><td><?= $list['title'] ?></td><td><img style="width:100px" src=" <?= $list['pic'] ?>" alt="课程封面"></td><td><?= $list['info'] ?></td><td><?= date("Y-m-d H:m:s", $list['add_time']) ?></td><td><button>删除</button><button>编辑</button></td></tr><?php endforeach; ?></tbody></table><!-- 生成分页按钮 --><p><?php for ($i = 1; $i <= $pages; $i++) : ?><?php $jump = sprintf('?page=%d', $i) ?><?php $active = ($i == $page) ? 'active' : '' ?><!-- 高亮显示选中页 --><a class="<?= $active ?>" href="<?= $jump ?>"><?= $i ?></a><?php endfor ?></p></body></html>
创建处理数据的pagedata.php
<?php$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]);// 每页的数据量$pageSize = 6;// 当前访问的是第几页$page = $_GET['page'] ?? 1;// 偏移量offset$offset = ($page - 1) * $pageSize;$sql = "SELECT `cou_id`,`title`,`pic`,`info`,`add_time`FROM `mj_course_lists` ORDER BY `cou_id` DESC LIMIT {$offset},{$pageSize}";$lists = $pdo->query($sql)->fetchAll();// 获取总页数$sql1 = "SELECT COUNT(`cou_id`) AS `sum` FROM `mj_course_lists`";$total = $pdo->query($sql1)->fetch()['sum'];// var_dump($total);//总页数$pages = ceil($total / $pageSize);// var_dump($pages);//var_dump($lists);
文件上传项目项在
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方法上传的数据量上限
$_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
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title></head><body><!-- application/x-www-urlencoded 不合适二进制数据或者包含ASCII字符的传输 --><form action="doupload.php" method="post" enctype="multipart/form-data"><label for="avatar">头像</label><input type="file" name="avatar" id="avatar"><button>提交</button></form></body></html>
创建doupload.php
<?php// 获取文件信息$_FILES//var_dump($_FILES);$originalFilename = $_FILES['avatar']['name'];$type = $_FILES['avatar']['type'];$tmp_name = $_FILES['avatar']['tmp_name'];$error = $_FILES['avatar']['error'];$size = $_FILES['avatar']['size'];$arr = explode('.', $originalFilename);$ext = end($arr); //获取文件后缀// 检查文件格式mine$exts = ['png', 'jpg', 'jpeg', 'wbmp', 'gif'];if (!in_array($ext, $exts)) {echo "<p style='color:red;font-size:20px;'>非法的文件类型</p>";return;}// 检查大小if($size > 307200){echo "<p>$originalFilename</p><p style='color:red;font-size:20px;'>文件过大</p>";return;}// `is_uploaded_file()` | 用来检测文件是否是通过http post方法上传的,而不是系统上的一个文件。作用是防止潜在攻击者通过问题脚本访问并非用于交互的文件if(is_uploaded_file($originalFilename)){echo ("$originalFilename is uploaded via HTTP POST");}else{echo ("$originalFilename is not uploaded via HTTP POST");}if ($error == 0) {//移动暂存区的图片到服务器指定的文件目录$des = 'storage/';if (!file_exists($des)) {mkdir($des, 0777, true);}// 为了确保同一秒钟两个用户上传的图片名称相同情况下,文件都能上传成功$prefix = array_shift($arr);$newName = date('YmdHms', time()) . md5($prefix) . time() . '.' . $ext;move_uploaded_file($tmp_name, $des . $newName);}switch ($error):case 0:echo '<p style="color:green">文件上传成功</p> ';echo "原始文件名称$originalFilename";echo "文件大小$size";break;case 1:echo '<p style="color:red">文件超过`php.ini`中`upload_max_filesize`值</p>';break;case 2:echo '<p style="color:red">文件大小超过表单中`MAX_FILE_SIZE`指定的值</p>';break;case 3:echo '<p style="color:red">文件只有部分被上传</p>';break;case 4:echo '<p style="color:red">没有文件被上传</p>';break;case 6:echo '<p style="color:red">找不到临时文件夹</p>';break;case 6:echo '<p style="color:red">文件写入失败</p>';break;default:echo '<p style="color:red">系统错误</p>';break;endswitch;
委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。这类似于继承,和在子类中调用父类的方法有点儿相似。
但在继承时,父类与子类的关系是固定的,而使用委托则可以在代码运行时改变使用的对象,这意味着委托比继承具有更大的灵活性。
事件委托:访问类中不存在的成员方法,会被魔术方法拦截,将请求重定向给或者委托给别的对象成员方法类处理。 委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。委托比继承更加灵活 父类与子类的关系是固定的,只能单继承,但是请求可以委托给多个对象。
<?php//被委托的类,数据库查询构造器class Query{//创建pdo对象的唯一实例private static $db;protected $table;protected $field;protected $limit;// private私有的 阻止此类在外部进行实例化private function __construct(){}static function connect($dsn, $user, $pwd){if (is_null(static::$db)) {static::$db = new pdo($dsn, $user, $pwd);}// return static::$db;// 返回query实例return new static;}public function table($table){$this->table = $table;return $this; //返回本对象 为了实现链式调用}public function where($where){}public function field($field){$this->field = $field;return $this;}public function limit($limit){$this->limit = $limit;return $this;}public function getSql(){return sprintf('SELECT %s FROM %s LIMIT %d ', $this->field, $this->table, $this->limit);}public function select(){return static::$db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);}}// 委托方class Db{static function __callStatic($name, $arguments){$dsn = 'mysql:host=localhost;dbname=phpcn;charset=utf8;port=3306';$user = 'root';$pwd = '';// 获取到被委托的类Query实例$q = Query::connect($dsn, $user, $pwd);return call_user_func([$q, $name], ...$arguments);}}$res = Db::table('mj_course_cat')->field('cat_id,name')->limit(20)->select();var_dump($res);
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号