当前位置: 首页 > 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

http://www.lryc.cn/news/176975.html

相关文章:

  • 蓝桥杯2023年第十四届省赛真题-异或和之和--题解
  • Linux 常用命令学习笔记
  • 支撑电动汽车规模化,特来电智能化升级群充产品
  • 本次CTF·泰山杯网络安全的基础知识部分
  • 通信协议:Uart的Verilog实现(下)
  • 嵌入式MCU都有什么高级用法?
  • 热启动和冷启动是什么,区别
  • 每日一题 494目标和(0-1背包)(灵神笔记)
  • 软件测试工作步骤详情
  • java项目之列车票务信息管理系统(ssm源码+文档)
  • 【Pytorch笔记】3.数学运算
  • MeterSphere 监控方案
  • elementui-plus+ts+axios使用el-upload组件自定义上传
  • 【STM32单片机】u8g2智能风扇设计
  • Java中的IO流的缓冲流
  • 7、SpringBoot_高级配置
  • cocos2dx查看版本号的方法
  • 某高校的毕设
  • 利用uvicorn、Starlette和pipeline将一个训练好的大模型发布成一个web服务
  • 贝赛尔曲线 - Vue3实现加入购物车抛物线效果组件
  • AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes解决方法
  • Fortinet 2023上半年全球威胁态势研究报告:勒索软件检测成下降趋势,针对性攻击持续升温
  • MySQL ——多表连接查询
  • 前沿技术 --> 待定
  • Linux定时python脚本(crontab版本)
  • 修改 Ubuntu .cache 和 pip cache 默认路径
  • 【Java SE】Lambda表达式
  • Kafka-UI
  • Unity 制作登录功能02-创建和链接数据库(SQlite)
  • 算法 岛屿数量-(递归回溯)