Blogger Information
Blog 19
fans 0
comment 1
visits 19542
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP封装的PDO操作MySql数据库操作类!简单易用!
TANKING的代码日志
Original
92 people have browsed it

摘要

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

良好的数据库操作类可以提供一定程度的安全性,通过参数化查询或准备语句来防止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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments