当前位置: 首页 > news >正文

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要

将PDO封装成PHP类进行调用有很多好处,包括:

1、封装性和抽象性: 通过将PDO封装到一个类中,您可以将数据库操作逻辑与应用程序的其他部分分离开来,提高了代码的组织性和可维护性。这样,您只需在一个地方维护数据库连接和查询逻辑,而不必在整个应用程序中散布数据库代码。

2、重用性: 将数据库操作封装成类使得这些操作可以在应用程序的不同部分重复使用,而无需重复编写相同的代码。这有助于减少代码冗余,提高效率。

3、安全性: 通过类的方法来执行数据库操作,可以轻松地实施预处理语句,从而减少了SQL注入攻击的风险。类还可以提供错误处理机制,使您能够更容易地处理数据库错误。

4、可扩展性: 使用类封装数据库操作,可以轻松地扩展和维护应用程序。如果需要添加新的数据库操作或更改现有的操作,只需修改类中的相应方法而不必更改应用程序的其他部分。

5、清晰的接口: 类提供了一个清晰的接口,使其他开发人员能够更容易地理解和使用数据库操作。这有助于团队协作和代码维护。

将PDO封装成PHP类可以提高代码的可维护性、可重用性和安全性,同时降低了代码的耦合度,使数据库操作更容易管理和扩展。这是一个良好的软件工程实践,特别适用于中大型和复杂的应用程序。

类文件

Database.php

以下是使用Chatgpt生成的操作类,但是我做了30%的修改和优化。

<?php/*** Title:PDO数据库操作类* Author:TANKING* Blog:https://segmentfault.com/u/tanking* Date:2023-09-18*/class Database{private $host;private $username;private $password;private $database;private $pdo;private $error = null;public function __construct($host, $username, $password, $database){$this->host = $host;$this->username = $username;$this->password = $password;$this->database = $database;$this->connect();}// 获取错误信息public function getError(){return $this->error;}// 连接数据库private function connect(){$dsn = "mysql:host={$this->host};dbname={$this->database}";try {$this->pdo = new PDO($dsn, $this->username, $this->password);$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch (PDOException $e) {die("Connection failed: " . $e->getMessage());}}// 插入数据public function insert($table, $data){try {$columns = implode(", ", array_keys($data));$values = ":" . implode(", :", array_keys($data));$sql = "INSERT INTO $table ($columns) VALUES ($values)";$stmt = $this->pdo->prepare($sql);$result = $stmt->execute($data);if (!$result) {$this->error = $stmt->errorInfo();}return $result;} catch (PDOException $e) {// 处理数据库异常$this->error = $e->getMessage();return FALSE;}}// 更新数据public function update($table, $data, $where){try {$set = "";foreach ($data as $key => $value) {$set .= "$key = :$key, ";}$set = rtrim($set, ', ');$sql = "UPDATE $table SET $set WHERE $where";$stmt = $this->pdo->prepare($sql);$result = $stmt->execute($data);if (!$result) {$this->error = $stmt->errorInfo();}return $result;} catch (PDOException $e) {// 处理数据库异常$this->error = $e->getMessage();return FALSE;}}// 删除数据public function delete($table, $where){try {$sql = "DELETE FROM $table WHERE $where";$stmt = $this->pdo->prepare($sql);$result = $stmt->execute();if($stmt->rowCount() === 0) {// 没有受影响的记录$this->error = '没有受影响的记录';return FALSE;}else {return $result;}} catch (PDOException $e) {// 处理数据库异常$this->error = $e->getMessage();return FALSE;}}// 查询一条数据public function queryOne($table, $conditions = []){$whereClause = $this->buildWhereClause($conditions);$sql = "SELECT * FROM $table $whereClause LIMIT 1";try {$stmt = $this->pdo->prepare($sql);$stmt->execute($conditions);return $stmt->fetch(PDO::FETCH_ASSOC);} catch (PDOException $e) {// 处理数据库异常$this->error = $e->getMessage();return FALSE;}}// 查询所有数据public function queryAll($table, $conditions = []){$whereClause = $this->buildWhereClause($conditions);$sql = "SELECT * FROM $table $whereClause";try {$stmt = $this->pdo->prepare($sql);$stmt->execute($conditions);return $stmt->fetchAll(PDO::FETCH_ASSOC);} catch (PDOException $e) {// 处理数据库异常$this->error = $e->getMessage();return FALSE;}}// 执行原生SQL语句public function executeSQL($sql, $params = []){try {$stmt = $this->pdo->prepare($sql);$result = $stmt->execute($params);if (!$result) {// 执行失败$this->error = $stmt->errorInfo();return FALSE;}return $stmt;} catch (PDOException $e) {// 处理数据库异常$this->error = $stmt->errorInfo();return FALSE;}}// 数据绑定private function buildWhereClause($conditions){if (empty($conditions)) {return '';}$where = 'WHERE';foreach ($conditions as $key => $value) {$where .= " $key = :$key AND";}$where = rtrim($where, ' AND');return $where;}}

实例

配置文件 Db.php

<?php/*** Title:数据库配置* Author:TANKING* Blog:https://segmentfault.com/u/tanking* Date:2023-09-18*/$DbConfig = array('db_host' => 'xxx', // 数据库服务器'db_name' => 'xxx', // 数据库名'db_user' => 'xxx', // 数据库账号'db_pwd' => 'xxx', // 数据库密码);include 'Database.php';
?>

以下实例使用一个名为artcles的数据库表进行操作演示。

在这里插入图片描述

插入数据 insert.php

<?php// 编码header("Content-type:application/json");// 数据库配置include 'Db.php';// 连接数据库$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);// 插入数据$data = ['aid' => rand(100000,999999), 'title' => 'sdfgsadg','tag' => 'ceshi','content' => '这是内容','author' => 'TANKING'];$insertArtcle = $db->insert('artcles', $data);if($insertArtcle){echo '插入成功';}else{echo '失败!' . $db->getError();}?>

更新数据 update.php

<?php// 编码header("Content-type:application/json");// 数据库配置include 'Db.php';// 连接数据库$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);// 更新$updateData = ['tag' => '测试'];$where = 'id = 19';$updateArtcle = $db->update('artcles', $updateData, $where);if($updateArtcle){echo '更新成功!';}else{echo '更新失败!' . $db->getError();}?>

删除数据 delete.php

<?php// 编码header("Content-type:application/json");// 数据库配置include 'Db.php';// 连接数据库$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);// 删除$where = 'id = 11';$deleteArtcle = $db->delete('artcles', $where);if($deleteArtcle){echo '删除成功!';}else{echo '删除失败!' . $db->getError();}?>

查询一条数据 queryOne.php

<?php// 编码header("Content-type:application/json");// 数据库配置include 'Db.php';// 连接数据库$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);// 查询一条数据$conditions = ['id' => 18];$getArtcle = $db->queryOne('artcles', $conditions);if($getArtcle){echo json_encode($getArtcle);}else{echo '查询失败!' . $db->getError();}?>

查询所有数据 queryAll.php

<?php// 编码header("Content-type:application/json");// 数据库配置include 'Db.php';// 连接数据库$db = new Database($DbConfig['db_host'], $DbConfig['db_user'], $DbConfig['db_pwd'], $DbConfig['db_name']);// 查询所有数据$conditions = [];$getArtcles = $db->queryAll('artcles', $conditions);if($getArtcles){echo json_encode($getArtcles);}else{echo '查询失败!' . $db->getError();}?>

执行原生SQL语句

// 插入
$sql = "INSERT INTO artcles (aid, title, tag, content, author) VALUES (:aid, :title, :tag, :content, :author)";
$params = [':aid' => rand(100000,999999), ':title' => '这是标题' . uniqid(),':tag' => 'tag' . rand(0,9),':content' => '这是内容' . uniqid(),':author' => 'TANKING'
];// 更新
$sql = "UPDATE artcles SET title = :title WHERE id = :id";
$params = [':id' => 22,':title' => '这是标题_已更新',
];// 删除
$sql = "DELETE FROM artcles WHERE id = :id";
$params = [':id' => 20
];// 查询
$sql = "SELECT * FROM artcles";
try {$stmt = $db->executeSQL($sql);if ($stmt) {$result = $stmt->fetchAll(PDO::FETCH_ASSOC);if (empty($result)) {// 没有匹配的结果echo "没有匹配的结果";} else {echo json_encode($result);}} else {echo "查询失败,错误信息:" . json_encode($db->getError());}
} catch (DatabaseException $e) {// 查询失败echo $e->getMessage();
}

作者

TANKING

相关文章:

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要 将PDO封装成PHP类进行调用有很多好处&#xff0c;包括&#xff1a; 1、封装性和抽象性&#xff1a; 通过将PDO封装到一个类中&#xff0c;您可以将数据库操作逻辑与应用程序的其他部分分离开来&#xff0c;提高了代码的组织性和可维护性。这样&#xff0c;您只需在一个地…...

蓝桥杯2023年第十四届省赛真题-异或和之和--题解

目录 蓝桥杯2023年第十四届省赛真题-异或和之和 题目描述 输入格式 输出格式 样例输入 样例输出 【代码实现】 大家觉得写得可以的话&#xff0c;可以加入QQ群907575059. 蓝桥杯2023年第十四届省赛真题-异或和之和 时间限制: 3s 内存限制: 320MB 提交: 241 解决: 66 …...

Linux 常用命令学习笔记

Linux 常用命令学习笔记 文件操作 ls&#xff1a;列出当前目录下的文件和文件夹。 ls -l&#xff1a;以长格式显示文件和文件夹的详细信息。ls -a&#xff1a;显示所有文件&#xff0c;包括隐藏文件。 cd [目录]&#xff1a;切换到指定目录。pwd&#xff1a;显示当前工作目录…...

支撑电动汽车规模化,特来电智能化升级群充产品

9月26日&#xff0c;中国领先的充电网生态运营商特来电重磅发布智能群充4.0产品&#xff0c;标志着特来电群充产品体系进一步升级&#xff0c;充电行业迎来更高质量、更高性能的设备与系统&#xff0c;充电网基础设施将更好地支撑大规模电动汽车的发展。 群充技术路线引领充电…...

本次CTF·泰山杯网络安全的基础知识部分

简记23年九月参加的泰山杯网络安全的部分基础知识的题目&#xff0c;随时补充 1. 国密算法哪个属于公钥&#xff1f; SM2 a. 国产密码算法&#xff08;国密算法&#xff09;是指国家密码局认定的国产商用密码算法&#xff0c;目前主要使用公开的SM2、SM3、SM4三类算法&#x…...

通信协议:Uart的Verilog实现(下)

4、UART接收器 UART接收器负责接收串行比特流&#xff0c;去除起始位和停止位&#xff0c;并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟&#xff0c;因此尽管数据以标准比特率到达&#xff0c;但数据未必与接收主机内的时钟同步。同步问题可…...

嵌入式MCU都有什么高级用法?

嵌入式MCU都有什么高级用法&#xff1f; 您举的几个例子&#xff0c;确实是MCU外设的一些高端玩法。只是不知道您是否想过&#xff0c;既然这些机制是被 人设计出来的&#xff0c;那它就是种标准用法。从微控制器的发展历程来看&#xff0c;许多硬件机制都是有了实际 需求后才…...

热启动和冷启动是什么,区别

app冷启动&#xff1a; 当应用启动时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c; 这个启动方式就叫做冷启动&#xff08;后台不存在该应用进程&#xff09;。冷启动因为系统会重新创建一个新的进程分配给它&#xff…...

每日一题 494目标和(0-1背包)(灵神笔记)

0-1背包模版 有n个物品&#xff0c;它们有各自的体积和价值&#xff0c;现有给定容量的背包&#xff0c;如何让背包里装入的物品具有最大的价值总和&#xff1f; 当前操作&#xff1f;枚举第i个物品选还是不选&#xff0c;不选容量不变&#xff0c;选容量减少 子问题&#xff…...

软件测试工作步骤详情

软件测试步骤按照研发阶段一般分为5个部分&#xff1a;单元测试、集成测试、确认测试、系统测试、验收测试&#xff0c;下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 一、单元测试的内容&#xff1a;&#xff08;白盒为主&#xff0c;黑盒为辅&#xff09;…...

java项目之列车票务信息管理系统(ssm源码+文档)

项目简介 列车票务信息管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、用户管理、车票信息管理、购票指南管理、管理员管理、论坛管理、我的收藏管理、系统管理、订单管理。前台首页&#xff1a;首页、车票信息、购票指南、我的收藏管理、论坛信息、我的、…...

【Pytorch笔记】3.数学运算

深度之眼官方账号 - 01-03-mp4-张量操作与线性回归 torch.add() 功能&#xff1a;逐元素计算inputalphaother。 torch.add(input,alpha1,other,outNone)input&#xff1a;tensor&#xff1b; alpha&#xff1a;other的系数&#xff0c;是个实数&#xff1b; other&#xff1…...

MeterSphere 监控方案

前言&#xff1a;在部署MeterSphere之后&#xff0c;很多时候需要看下MeterSphere服务的监控信息&#xff0c;虽然有监控告警脚本&#xff0c;但还不是太直观&#xff0c;所以就结合 PrometheusExporterGrafana 部署一套完整的MeterSphere监控方案。 首先我们先罗列一下需要监控…...

elementui-plus+ts+axios使用el-upload组件自定义上传

1.前言&#xff1a; 使用element ui有很多便捷之处&#xff0c;但是由于是封装的组件和自己写还是有些许的不一样&#xff0c;这里主要解决几个问题。 1. 如何获取子组件实例 2. 如何自定义上传方法 2.两个问题&#xff1a; ⛺️ 获取子组件实例 实际上vue一般通过ref获取子组…...

【STM32单片机】u8g2智能风扇设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块、DS18B20温度传感器、直流电机、红外遥控等。 主要功能&#xff1a; 初始化后进入温度显示界面&#xff0c;系统初始状态为手动…...

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…...

7、SpringBoot_高级配置

一、配置高级 1.临时属性设置 1.1引出问题 如果目标电脑上8080端口已经使用&#xff0c;再次使用该端口会出现端口占用问题 解决方式 重新更换配置文件修改端口打包通过临时属性配置新端口更换配置文件 1.2添加临时属性配置 通过临时属性修改8080端口 java -jar 项目.jar…...

cocos2dx查看版本号的方法

打开文件&#xff1a;项目根目录\frameworks\cocos2d-x\docs\RELEASE_NOTES.md 知道引擎版本号的意义&#xff1a; 1.面试中经常被问到(面试官想知道你会不会查版本号&#xff0c;你会查也不一定会去看&#xff0c;如果你去看了说明你是一个有心人&#xff0c;或者想深入研究下…...

某高校的毕设

最近通过某个平台接的单子&#xff0c;最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面&#xff1a;推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…...

利用uvicorn、Starlette和pipeline将一个训练好的大模型发布成一个web服务

技术名词&#xff1a; 1、Starlette&#xff1a; 它是一个轻量级、高度可用性和可扩展性的Web框架&#xff0c;它专门为异步应用程序设计。 Starlette基于Python 3.6的异步/协程语法&#xff0c;具有快速响应性能和低延迟。你可以将它理解为Java的Spring。 安装&#xff1a;…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...