打造一套属于自己的php开发框架(一)封装Db类

一直使用thinkphp或者laravel框架,越到后面越发现,这些框架占用太大了,最主要的是很多东西完全用不到,我就想为啥不能自己封装一个?想到就搞,这个是一个Db类,主要封装了MySQL的增删改查方法,使用起来类似thinkphp和laravel。

多的不说了,直接上代码:

<?phpclass Db
{protected static \PDO $connection; // 数据库连接protected static string $table; // 数据表名protected static array $wheres = []; // 查询条件protected static ?int $findId = null; // 查找的记录 IDprotected static bool $initialized = false; // 数据库连接是否已初始化// 确保数据库连接已建立protected static function ensureConnection(){if (!self::$initialized) {self::$connection = new \PDO("mysql:host=localhost;dbname=数据库名称", "数据库用户名", "数据库密码");self::$initialized = true;}}// 设置数据表名public static function table(string $table): self{self::ensureConnection();self::$table = $table;return new self();}// 设置查询条件public static function where(string $column, string $operator, $value): self{self::$wheres[] = compact('column', 'operator', 'value');return new self();}// 根据 ID 查询记录public static function find(int $id): array{self::ensureConnection();$query = "SELECT * FROM " . self::$table . " WHERE id = :id";$statement = self::$connection->prepare($query);$statement->execute([':id' => $id]);return $statement->fetch(\PDO::FETCH_ASSOC);}// 查询符合条件的记录public static function get(): array{self::ensureConnection();$query = "SELECT * FROM " . self::$table;if (!empty(self::$wheres)) {$query .= " WHERE ";foreach (self::$wheres as $where) {$query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";}$query = rtrim($query, " AND ");}$statement = self::$connection->prepare($query);$statement->execute();return $statement->fetchAll(\PDO::FETCH_ASSOC);}// 分页查询public static function paginate(int $page = 1, int $perPage = 10): array{self::ensureConnection();$offset = ($page - 1) * $perPage;$query = "SELECT COUNT(*) as count FROM " . self::$table;if (!empty(self::$wheres)) {$query .= " WHERE ";foreach (self::$wheres as $where) {$query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";}$query = rtrim($query, " AND ");}$statement = self::$connection->prepare($query);$statement->execute();$totalResults = $statement->fetchColumn();$query = "SELECT * FROM " . self::$table;if (!empty(self::$wheres)) {$query .= " WHERE ";foreach (self::$wheres as $where) {$query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";}$query = rtrim($query, " AND ");}$query .= " LIMIT $perPage OFFSET $offset";$statement = self::$connection->prepare($query);$statement->execute();$results = $statement->fetchAll(\PDO::FETCH_ASSOC);$totalPages = ceil($totalResults / $perPage);return ['data' => $results,'total' => $totalResults,'perPage' => $perPage,'currentPage' => $page,'totalPages' => $totalPages,];}// 插入数据public static function insert(array $data): bool{self::ensureConnection();$columns = implode(', ', array_keys($data));$placeholders = implode(', ', array_fill(0, count($data), '?'));$values = array_values($data);$query = "INSERT INTO " . self::$table . " ($columns) VALUES ($placeholders)";$statement = self::$connection->prepare($query);return $statement->execute($values);}// 更新数据public static function update(array $data, int $id): bool{self::ensureConnection();$updates = [];foreach ($data as $column => $value) {$updates[] = "$column = ?";}$setClause = implode(', ', $updates);$query = "UPDATE " . self::$table . " SET $setClause WHERE id = ?";$values = array_values($data);$values[] = $id;$statement = self::$connection->prepare($query);return $statement->execute($values);}// 删除数据public static function delete(int $id): bool{self::ensureConnection();$query = "DELETE FROM " . self::$table . " WHERE id = ?";$statement = self::$connection->prepare($query);return $statement->execute([$id]);}
}

使用方法:

假设有一个名为 users 的数据表

1.插入一条数据

Db::table('users')->insert(['name' => 'John', 'age' => 30]);

2.查询 ID 为 1 的记录

$result = Db::table('users')->find(1);
var_dump($result); // 输出查询结果

3.更新 ID 为 1 的记录

Db::table('users')->update(['age' => 35], 1);

4.查询年龄大于 30 的用户,并分页显示

$users = Db::table('users')->where('age', '>', 30)->paginate(1, 10);
var_dump($users); // 输出分页结果

5.删除 ID 为 1 的记录

Db::table('users')->delete(1);

大概就是这样了,实现了简单的增删改查,如果不够的可以自己添加一些代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

链表OJ - 6(链表分割)

题目描述&#xff08;来源&#xff09; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

ChatGPT:引领未来的语言模型革命?

一、引言 随着人工智能技术的不断发展&#xff0c;Chat GPT作为一种自然语言处理技术&#xff0c;已经逐渐渗透到各个领域&#xff0c;具有广泛的应用前景。本文将从多个角度探讨Chat GPT的应用领域及其未来发展趋势。 ChatGPT的语言处理能力超越了以往任何一款人工智能产品。…

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型&#xff0c;每个人都可以有自己的GTP 第一步&#xff1a;安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…

【小白学机器学习13】一文理解假设检验的反证法,H0如何设计的,什么时候用左侧检验和右侧检验,等各种关于假设检验的基础知识

目录 前言&#xff1a; 目标 1 什么叫 假设检验 1.1 假设检验的定义 1.1.1 来自百度百科 1.1.2 维基百科 1.2 假设检验的最底层逻辑&#xff1a;是反证法思想 1.3 假设检验的底层构造&#xff1a;小概率反证法思想 2 什么叫反证法 2.1 反证法的概念 2.1.1 来自百度…

MFC下CPictureCtrl控件基于鼠标左键坐标的直线绘图

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.创建自定义类CMyPictureCtrl 2.布局Dlg 3.实验代码 4.运行结果 在基于对话框的MFC应用程序中&#xff0c;通过鼠标操作获取坐标并在CPictureCtrl控件中使用Lin…

通过Idea部署Tomcat服务器

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

小程序如何优化搜索排名,获取曝光

在移动互联网时代&#xff0c;小程序以其便捷、轻量级的特点&#xff0c;逐渐成为用户获取服务的重要渠道。然而&#xff0c;小程序数量众多&#xff0c;如何让自己的小程序在搜索中脱颖而出&#xff0c;获取更多的曝光和流量&#xff0c;成为众多开发者关注的焦点。 一、理解…

DC-8渗透测试复现

DC-8渗透测试复现 目的&#xff1a; 获取最高权限以及flag 过程&#xff1a; 信息打点--sql注入- 命令执行反弹shell-exim4提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.137) 靶机&#xff1a;DC_3(192.168.85.140) 复现&#xff1a; 一.信息收集 nmap -…

在报表控件 FastReport .NET 中使用 PageCreate 事件

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…

编译OpenWRT固件

前言 编译环境&#xff0c;我是使用Ubuntu16.04.07 LTS 64位版 1.安装Ubuntu16.04.07 LTS 64 Ubuntu16.04.07 LTS 64安装的时候会出现一个bug&#xff0c;如果开始安装界面选了中文之后就会出现 提示错误信息&#xff1a;无法安装busybox-initramfs&#xff0c;向目标系统中…

openlayers 入门教程(六):controls 篇

目录 一、常用的控件 二、使用控件方法 三、添加删除control 的基本方法 四、control示例 1 比例尺 - ScaleLine 2 鹰眼/缩小图 - OverviewMap 3 全屏 - FullScreen 4 版权信息 - Attribution 5 旋转地图 - Rotate 6 放大缩小 - Zoom 7 缩放滑块控件 - ZoomSlider …