PHP小案例:分页实现,文件上传,链式数据库查询构造器
原生分页实现
首先准备好数据
创建数据库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.26
SET 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文件上传
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
<!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链式数据库查询构造器
委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。这类似于继承,和在子类中调用父类的方法有点儿相似。
但在继承时,父类与子类的关系是固定的,而使用委托则可以在代码运行时改变使用的对象,这意味着委托比继承具有更大的灵活性。
事件委托:访问类中不存在的成员方法,会被魔术方法拦截,将请求重定向给或者委托给别的对象成员方法类处理。 委托是指一个对象转发或者委托一个请求给另一个对象,被委托的一方替原先对象处理请求。委托比继承更加灵活 父类与子类的关系是固定的,只能单继承,但是请求可以委托给多个对象。
<?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);