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

news2025/1/11 5:51:19

摘要

将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

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

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

相关文章

面对IT部门和业务部门跨网文件交换的不同需求,怎样才能兼顾呢?

文件交换是企业中必不可少的一环&#xff0c;无论是内部员工之间&#xff0c;还是与外部客户、供应商、合作伙伴之间&#xff0c;都需要频繁地进行文件的发送和接收。然而&#xff0c;由于企业内外网之间的隔离&#xff0c;跨网文件交换往往面临着诸多困难和挑战。如何在保证文…

【Verilog语法】比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。

比较不同计数器的运算方式&#xff0c;其中有一个数是延迟打一拍的效果&#xff0c;目的是使得两个计数器的结果相同。 1&#xff0c;第一种2&#xff0c;第二种3&#xff0c;第三种 第三种方案&#xff0c;完成实现。 1&#xff0c;第一种 &#xff08;1&#xff09;RTL modu…

基于Python开发的火车票分析助手(源码+可执行程序+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的火车票分析助手&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;…

企业如何使员工保持工作的积极性?

保持员工的工作积极性对于企业来说至关重要。激发员工的热情和投入度可以提高工作效率、创造力和团队合作&#xff0c;进而为企业带来更好的成果和竞争优势。以下是一些企业可以采取的方法来确保员工保持积极性&#xff1a; 提供发展机会 员工希望在职业生涯中不断成长和发展…

数据库管理-第105期 安装Database Valut组件(20230919)

数据库管理-第105期 安装Database Valut组件&#xff08;20230919&#xff09; 之前无论是是EXPDP还是PDB中遇到的一些问题&#xff0c;其实都跟数据库的DV&#xff08;Database Valut&#xff09;组件有关&#xff0c;因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …

Seata 源码篇之AT模式启动流程 - 上 - 02

Seata 源码篇之AT模式启动流程 - 02 自动配置两个关键点 初始化初始化TM初始化RM初始化TC 全局事务执行流程TM 发起全局事务GlobalTransactional 注解处理全局事务的开启 TM 和 RM 执行分支事务IntroductionDelegatingIntroductionInterceptorDelegatePerTargetObjectIntroduct…

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器&#xff0c;用于写代码&#xff0c;更是一款多模式编辑器 vim的基本概念 vim有许多种模式&#xff0c;但是铁三角是以下三种模式&#xff1a;命令模式&#xff0c;插入模式&#xff0c;底行模式 1 正常/普通/命令模式&#xff08;默认打开&…

搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界

文章目录 1. 树洞外链网站搭建1.1 下载安装树洞外链1.2 树洞外链网页测试1.3 cpolar的安装和注册 2.本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试 社交平台具有庞…

Go 语言学习总结(9)—— Go 与 Java 全面对比总结

基本语法格式 Golang: 编码风格相对统一&#xff0c;简单&#xff0c;没有太多的语法糖等&#xff0c;Java层次清晰&#xff0c;全面面向对象。 变量相关 变量的声明及使用 在Java或者PHP、Python中&#xff0c;声明了变量&#xff0c;可以不使用&#xff0c;也不报错。 p…

win11 新建markdown文件 添加到右键新建项 无反应(已解决)

需要操作 2 处注册表 1. win R输入【regedit】 定位路径 【计算机\HKEY_CLASSES_ROOT.md】 点击.md文件夹, 双击右侧(默认)项&#xff0c;将数值数据改为【Typora.md】 右键.md文件夹 > 新建 > 项&#xff0c;把新建的项命名为【ShellNew】 右键ShellNew > 新建 >…

基于Spring Boot+ Vue的健身房管理系统与实现

小熊学Java全能学面试指南&#xff1a;https://javaxiaobear.cn 摘要 随着健身行业的快速发展&#xff0c;健身房管理系统成为了提高管理效率和用户体验的重要工具。本论文旨在设计与实现一种基于前后端分离的健身房管理系统&#xff0c;通过前后端分离的架构模式&#xff0c;…

如何代码降重

目录 一、使用的相关工具二、冗余代码的分类和压缩策略2.1 无用代码2.2 重复代码2.3 相似代码 三、长久治理机制3.1 git-hooks 一、使用的相关工具 以下工具都有各自详细说明的文档。除非有必要&#xff0c;下文不再对其相关使用作详细说明。 仓库代码查重工具&#xff1a;http…

WebStorm 2023年下载、安装教程、亲测有效

文章目录 简介安装步骤常用快捷键 简介 WebStorm 是JetBrains公司旗下一款JavaScript 开发工具。已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源&#xff0c;继承了IntelliJ IDEA强大的JS部分的…

PostgreSQL 主从复制故障切换

文章目录 前言环境准备搭建主从节点配置主从节点从节点加入主节点查看主从信息 主从故障切换 前言 PostgreSQL的主从复制是一种非常简单且常用的高可用性和可扩展性解决方案&#xff0c;本质上是将主服务器的数据复制到一个或多个从服务器上&#xff0c;从而提高系统的性能和可…

会话控制学习

文章目录 介绍cookieexpress中使用cookie获取cookie session配置区别 介绍 cookie express中使用cookie 退出登录就是删除cookie 获取cookie 添加中间键后&#xff0c;直接获取 session 配置 区别

Linux 内核代码是 AMD GPU 驱动代码

导读Linux 内核代码是 AMD GPU 驱动代码 1/7 的 Linux 内核代码是 AMD GPU 驱动代码 随着开发中的 Linux 6.6 内核增加了对更多即将推出的 Radeon 图形处理器的支持&#xff0c;现在内核中 AMD GPU 驱动代码的行数已超过 500 万行。其中很大一部分是 AMD 在每一代新版本中不断…

Python的协程异步IO(asyncio)详解

一、协程简介 1.1 定义 协程不是系统级线程&#xff0c;很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数&#xff0c;这些函数之间可以相互快速切换。 协程和用户态线程非常接近&#xff0c;用户态线程之间的切换…

一文告诉你为什么时序场景下 TDengine 数据订阅比 Kafka 好

在 TDengine 3.0 中&#xff0c;我们对流式计算、数据订阅功能都进行了再升级&#xff0c;帮助用户极大简化了数据架构的复杂程度&#xff0c;降低整体运维成本。TDengine 提供的类似消息队列产品的数据订阅、消费接口&#xff0c;本质上是为了帮助应用实时获取写入 TDengine 的…

第二证券:a股注册制什么意思?

A股施行新的注册原则已经是大势所趋。那么什么是A股注册制&#xff1f;A股注册制和现行的核准制的差异在哪里&#xff1f;关于出资者来说&#xff0c;A股注册制带来了什么样的影响&#xff1f;这篇文章将从多个角度进行分析&#xff0c;为咱们答复疑问。 一、什么是A股注册制&…

[git] rebase 合并多个commit

一、未使用 rebase 的提交数量 上图中 可以看到 有四提交 二、使用rebase git rebase -i head~2表示合并 最后的两个提交, 也就是vv1 和 vv2 回车会弹出&#xff1a; 修改为 pick&#xff1a;保留该commit&#xff08;缩写:p&#xff09; reword&#xff1a;保留该commit…