博客列表 >PHP封装的PDO操作MySql数据库操作类!简单易用!

PHP封装的PDO操作MySql数据库操作类!简单易用!

TANKING的代码日志
TANKING的代码日志原创
2023年10月21日 09:53:3093浏览

摘要

数据库操作类可以封装数据库连接和操作,使代码更易于维护和扩展。它们提供了一种组织代码的方法,将数据库相关的功能放在一个类中,以便于复用。

良好的数据库操作类可以提供一定程度的安全性,通过参数化查询或准备语句来防止SQL注入攻击。这有助于保护数据库免受恶意输入的影响。

良好的数据库操作类可以提供一定程度的安全性,通过参数化查询或准备语句来防止SQL注入攻击。这有助于保护数据库免受恶意输入的影响。

数据库操作类有助于提高PHP应用程序的可维护性、安全性和性能,同时促进代码的重用和更好的代码组织。然而,选择适合项目需求的数据库操作类以及正确使用它们非常重要。

Database.php

  1. <?php
  2. /**
  3. * PHP PDO MySQL数据库操作类
  4. * 作者:TANKING
  5. * 时间:2023-10-12
  6. * 博客:https://segmentfault.com/u/tanking
  7. */
  8. class DB_API {
  9. private $pdo;
  10. private $error;
  11. // 连接数据库
  12. public function __construct($config) {
  13. $dsn = "mysql:host={$config['db_host']};port={$config['db_port']};dbname={$config['db_name']}";
  14. try {
  15. $this->pdo = new PDO($dsn, $config['db_user'], $config['db_pass']);
  16. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  17. } catch (PDOException $e) {
  18. $this->error = $e->getMessage();
  19. }
  20. }
  21. // 插入
  22. public function add($table, $data) {
  23. try {
  24. $columns = implode(', ', array_keys($data));
  25. $values = implode(', :', array_keys($data));
  26. $query = "INSERT INTO $table ($columns) VALUES (:$values)";
  27. $stmt = $this->pdo->prepare($query);
  28. $stmt->execute($data);
  29. return $this->pdo->lastInsertId();
  30. } catch (PDOException $e) {
  31. $this->error = $e->getMessage();
  32. return false;
  33. }
  34. }
  35. // 更新
  36. public function update($table, $where, $data) {
  37. try {
  38. // 构建SET子句
  39. $set = '';
  40. foreach ($data as $key => $value) {
  41. $set .= "$key = :$key, ";
  42. }
  43. $set = rtrim($set, ', ');
  44. // 构建WHERE子句
  45. $whereClause = '';
  46. foreach ($where as $key => $value) {
  47. $whereClause .= "$key = :where_$key AND ";
  48. }
  49. $whereClause = rtrim($whereClause, 'AND ');
  50. // 构建SQL查询
  51. $query = "UPDATE $table SET $set WHERE $whereClause";
  52. // 创建预处理语句
  53. $stmt = $this->pdo->prepare($query);
  54. // 绑定更新数据的参数
  55. foreach ($data as $key => $value) {
  56. $stmt->bindValue(":$key", $value);
  57. }
  58. // 绑定WHERE条件的参数
  59. foreach ($where as $key => $value) {
  60. $stmt->bindValue(":where_$key", $value);
  61. }
  62. // 执行预处理语句
  63. $stmt->execute();
  64. // 操作成功
  65. return true;
  66. } catch (PDOException $e) {
  67. $this->error = $e->getMessage();
  68. // 操作失败
  69. return false;
  70. }
  71. }
  72. // 删除
  73. public function delete($table, $where, $params = array()) {
  74. try {
  75. // 构建WHERE子句
  76. $whereClause = '';
  77. foreach ($where as $key => $value) {
  78. $whereClause .= "$key = :$key AND ";
  79. }
  80. $whereClause = rtrim($whereClause, 'AND ');
  81. // 构建SQL查询
  82. $query = "DELETE FROM $table WHERE $whereClause";
  83. // 创建预处理语句
  84. $stmt = $this->pdo->prepare($query);
  85. // 绑定WHERE条件的参数
  86. foreach ($where as $key => $value) {
  87. $stmt->bindValue(":$key", $value);
  88. }
  89. // 执行预处理语句
  90. $stmt->execute();
  91. // 操作成功
  92. return true;
  93. } catch (PDOException $e) {
  94. $this->error = $e->getMessage();
  95. // 操作失败
  96. return false;
  97. }
  98. }
  99. // 查询
  100. public function select($table, $fields = "*", $conditions = null, $likeConditions = null, $orderBy = null, $limit = null, $params = array()) {
  101. try {
  102. // 构建SELECT子句
  103. if (is_array($fields)) {
  104. $fields = implode(', ', $fields);
  105. } elseif ($fields === "*") {
  106. $fields = "*";
  107. } else {
  108. $fields = "";
  109. }
  110. // 构建WHERE子句
  111. $whereClause = '';
  112. if (!is_null($conditions) && is_array($conditions)) {
  113. foreach ($conditions as $key => $value) {
  114. $whereClause .= "$key = :$key AND ";
  115. }
  116. $whereClause = rtrim($whereClause, 'AND ');
  117. }
  118. // 合并LIKE条件
  119. if (!is_null($likeConditions) && is_array($likeConditions)) {
  120. if (!empty($whereClause)) {
  121. $whereClause .= ' AND ';
  122. }
  123. foreach ($likeConditions as $key => $value) {
  124. $whereClause .= "$key LIKE :like_$key AND ";
  125. $params[":like_$key"] = $value;
  126. }
  127. $whereClause = rtrim($whereClause, 'AND ');
  128. }
  129. // 构建ORDER BY子句
  130. $orderByClause = '';
  131. if (!is_null($orderBy) && is_array($orderBy)) {
  132. $orderByClause = "ORDER BY " . implode(', ', $orderBy);
  133. }
  134. // 构建LIMIT子句
  135. $limitClause = '';
  136. if (!is_null($limit)) {
  137. $limitClause = "LIMIT $limit";
  138. }
  139. // 构建SQL查询
  140. $query = "SELECT $fields FROM $table";
  141. if (!empty($whereClause)) {
  142. $query .= " WHERE $whereClause";
  143. }
  144. if (!empty($orderByClause)) {
  145. $query .= " $orderByClause";
  146. }
  147. if (!empty($limitClause)) {
  148. $query .= " $limitClause";
  149. }
  150. // 创建预处理语句
  151. $stmt = $this->pdo->prepare($query);
  152. // 绑定参数
  153. if (!is_null($conditions) && is_array($conditions)) {
  154. foreach ($conditions as $key => $value) {
  155. $stmt->bindValue(":$key", $value);
  156. }
  157. }
  158. if (!is_null($likeConditions) && is_array($likeConditions)) {
  159. foreach ($likeConditions as $key => $value) {
  160. $stmt->bindValue(":like_$key", $value);
  161. }
  162. }
  163. // 执行预处理语句
  164. $stmt->execute();
  165. // 获取查询结果
  166. $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
  167. return $result; // 返回查询结果数组
  168. } catch (PDOException $e) {
  169. $this->error = $e->getMessage();
  170. return false; // 操作失败
  171. }
  172. }
  173. // 执行原生SQL语句
  174. public function execQuery($query, $params = array()) {
  175. try {
  176. // 创建预处理语句
  177. $stmt = $this->pdo->prepare($query);
  178. // 绑定参数
  179. foreach ($params as $key => $value) {
  180. $stmt->bindValue($key, $value);
  181. }
  182. // 执行预处理语句
  183. $stmt->execute();
  184. // 操作成功
  185. return true;
  186. } catch (PDOException $e) {
  187. $this->error = $e->getMessage();
  188. // 操作失败
  189. return false;
  190. }
  191. }
  192. // 错误信息
  193. public function errorMsg() {
  194. return $this->error;
  195. }
  196. }

Db.php

  1. <?php
  2. // 引入操作类
  3. include 'Database.php';
  4. // 配置文件
  5. $config = array(
  6. 'db_host' => 'localhost',
  7. 'db_port' => 3306,
  8. 'db_name' => 'xxx',
  9. 'db_user' => 'xxx',
  10. 'db_pass' => 'xxx'
  11. );
  12. ?>

使用示例

以表名为 test_table 为示例作为示例代码。

创建表SQL:

  1. CREATE TABLE `test_table` (
  2. `id` int(10) PRIMARY KEY AUTO_INCREMENT NOT NULL,
  3. `title` varchar(32) NOT NULL,
  4. `content` varchar(255) NOT NULL
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert示例

  1. <?php
  2. // 引入配置
  3. include 'Db.php';
  4. // 实例化
  5. $db = new DB_API($config);
  6. // 数据
  7. $insertData = array(
  8. 'title' => 'this is title',
  9. 'content' => 'this is content',
  10. );
  11. // 执行
  12. $insertSQL = $db->add('test_table', $insertData);
  13. // 结果
  14. if ($insertSQL) {
  15. // 成功
  16. echo '插入成功,ID是:' . $insertSQL;
  17. } else {
  18. // 失败
  19. echo '插入失败,原因:' . $db->errorMsg();
  20. }
  21. ?>

update示例

  1. <?php
  2. // 引入配置
  3. include 'Db.php';
  4. // 实例化
  5. $db = new DB_API($config);
  6. // 条件
  7. // 只支持=,不支持>,<,>=,<=之类的
  8. // 如需更复杂的条件请使用执行原生语句的方法
  9. $where = array(
  10. 'id' => '1'
  11. );
  12. // 数据
  13. $updateData = array(
  14. 'content' => 'content is updated'
  15. );
  16. // 执行
  17. $updatedSQL = $db->update('test_table', $where, $updateData);
  18. // 结果
  19. if ($updatedSQL) {
  20. // 成功
  21. echo '更新成功';
  22. } else {
  23. // 失败
  24. echo '更新失败,原因:' . $db->errorMsg();
  25. }
  26. ?>

delete示例

  1. <?php
  2. // 引入配置
  3. include 'Db.php';
  4. // 实例化
  5. $db = new DB_API($config);
  6. // 条件
  7. $where = array(
  8. 'id' => 4,
  9. );
  10. // 执行
  11. $deleteSQL = $db->delete('test_table', $where);
  12. // 结果
  13. if ($deleteSQL) {
  14. // 成功
  15. echo '删除成功';
  16. } else {
  17. // 失败
  18. echo '删除失败,原因:' . $db->errorMsg();
  19. }
  20. ?>

select示例

  1. <?php
  2. // 引入配置
  3. include 'Db.php';
  4. // 实例化
  5. $db = new DB_API($config);
  6. // 使用方法
  7. // $db->select('表名', ['字段1','字段2',...], where条件, LIKE条件, ORDER条件, LIKIT条件);
  8. // 如果查询所有字段,使用'*'代替数组
  9. // $db->select('表名', '*', where条件, LIKE条件, ORDER条件, LIKIT条件);
  10. // 无需使用的条件传递null
  11. // $db->select('表名', '*', where条件, null, null, null);
  12. // 查询所有字段,没有查询条件
  13. $selectSQL = $db->select('test_table', '*');
  14. // 查询指定字段,没有查询条件
  15. // $selectSQL = $db->select('test_table', ['id', 'title']);
  16. // 根据以下条件
  17. // 查询所有字段
  18. // $where = array(
  19. // 'id' => 3
  20. // );
  21. // $selectSQL = $db->select('test_table', '*', $where);
  22. // 根据以下条件
  23. // 查询指定字段
  24. // $where = array(
  25. // 'id' => 3
  26. // );
  27. // $selectSQL = $db->select('test_table', ['title'], $where);
  28. // 使用LIKE条件
  29. // 如果没有where条件就直接传入null
  30. // '*'是查询所有字段,如需查询指定字段传入['字段1','字段2',....]
  31. // $likeWhere = array(
  32. // 'title' => '%一带一路%'
  33. // );
  34. // $selectSQL = $db->select('test_table', '*', null, $likeWhere);
  35. // 使用where条件和LIKE条件
  36. // '*'是查询所有字段,如需查询指定字段传入['字段1','字段2',....]
  37. // $where = array(
  38. // 'id' => 3
  39. // );
  40. // $likeWhere = array(
  41. // 'title' => '%一带一路%'
  42. // );
  43. // $selectSQL = $db->select('test_table', '*', $where, $likeWhere);
  44. // 使用排序条件
  45. // $orderBy = array('id DESC');
  46. // $selectSQL = $db->select('test_table', '*', null, null, $orderBy);
  47. // 使用限制条件
  48. // $limit = 2; // 取2条
  49. // $limit = '0,3'; // 第1条开始,取3条
  50. // $limit = '5,2'; // 第5条开始,取2条
  51. // $selectSQL = $db->select('test_table', '*', null, null, null, $limit);
  52. // 结果
  53. if ($selectSQL) {
  54. // 成功
  55. echo json_encode($selectSQL, JSON_UNESCAPED_UNICODE);
  56. } else {
  57. // 失败
  58. echo '查询失败,原因:' . $db->errorMsg();
  59. }
  60. ?>

执行原生语句示例

  1. <?php
  2. // 引入配置
  3. include 'Db.php';
  4. // 实例化
  5. $db = new DB_API($config);
  6. // SQL语句
  7. $query = "INSERT INTO test_table (title, content) VALUES (:title, :content)";
  8. // 数据绑定
  9. $params = array(
  10. ':title' => 'New Title By execQuery',
  11. ':content' => 'New Content By execQuery',
  12. );
  13. // 执行
  14. $querySQL = $db->execQuery($query, $params);
  15. // 结果
  16. if ($querySQL) {
  17. // 成功
  18. echo 'SQL执行成功!';
  19. } else {
  20. // 失败
  21. echo 'SQL执行失败,原因:' . $db->errorMsg();
  22. }
  23. ?>

作者

TANKING

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议