PHP PDO 封装类及事务操作示例

纸上星河
纸上星河
发布时间:2026-10-13 | 2人浏览过
原创

PDO(PHP Data Objects)是 PHP 中访问数据库的统一接口,支持预处理语句和参数绑定,能有效防止 SQL 注入。本文将展示一个基础的 PDO 封装类实现,涵盖连接初始化、常规查询封装以及基于事务的数据操作,帮助开发者简化 PHP 数据库交互流程。

PDO 基础封装类设计

为了简化重复的数据库连接和操作代码,通常会将 PDO 功能封装到一个类中。该类负责管理数据库连接对象 $con,并提供统一的 query 方法来处理不同类型的 SQL 语句。

class DB {
  //pdo对象
  public $con = NULL;
  function DB()
  {
    $this->con = new PDO("mysql:host=127.0.0.1;dbname=dbtest", "root", "xxx", array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`',
      PDO::ATTR_PERSISTENT => TRUE,
    ));
    $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->con->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
  }
  public function query($sql, $para = NULL)
  {
    $sqlType = strtoupper(substr($sql, 0, 6));
    $cmd = $this->con->prepare($sql);
    if($para != NULL)
    {
      $cmd->execute($para);
    }
    else
    {
      $cmd->execute();
    }
    if($sqlType == "SELECT")
    {
      return $cmd->fetchAll(); 
    }
    if($sqlType == "INSERT")
    {
      return $this->con->lastInsertId();
    }
    return $cmd->rowCount();
  }
}

第1步:初始化数据库连接

在构造函数中建立与 MySQL 数据库的连接。关键配置包括:

  • host 和 dbname:指定服务器地址和数据库名称。
  • PDO::MYSQL_ATTR_INIT_COMMAND:设置字符集为 utf8,确保中文存储正常。
  • PDO::ATTR_ERRMODE:设置为 ERRMODE_EXCEPTION,启用异常模式,便于捕获和调试数据库错误。
  • PDO::ATTR_CASE:将列名转换为大写,保持查询结果的一致性。

第2步:封装通用查询方法

query 方法根据 SQL 语句的前缀判断操作类型:
- SELECT:返回所有匹配的行数组(fetchAll)。
- INSERT:返回最后插入行的 ID(lastInsertId)。
- 其他(如 UPDATE, DELETE):返回受影响的行数(rowCount)。

该方法自动调用 prepare 进行预处理,并通过 execute 执行。若传入参数数组 $para,则进行参数绑定;否则直接执行空参数的预处理语句。

PDO 事务操作与应用示例

除了基本查询,PDO 还支持 ACID 事务,这对于保证多步数据操作的原子性至关重要。以下示例演示了如何使用封装类进行常规查询,以及如何手动控制事务。

include "pdo.php";
$db = new DB();
$subjectList = $db->query("SELECT * FROM `table1`");
$count = $db->query("UPDATE `table1` SET `name` = 'test' WHERE `id` = :id", array(':id' => 795));
try
{
  echo $db->con->beginTransaction();
  $count = $db->con->exec("UPDATE `table1` SET `name` = 'test1' WHERE `id` = 795");
  $count = $db->con->exec("UPDATE `table1` SET `name1` = 'test22' WHERE `id` = 795");
  $count = $db->con->exec("UPDATE `table1` SET `name1` = 'test333' WHERE `id` = 795");
  echo $db->con->commit();
}
catch (Exception $e)
{
  // MYSQL 的表类型 InnoDB(支持事务) MyISAM(不支持事务)
  echo $db->con->rollBack();
  throw new MyException("事务测试错误", $e);
}
$db = NULL;

第3步:执行参数化更新

在常规操作中,使用 query 方法的第二个参数传入关联数组(如 array(':id' => 795)),PDO 会自动将占位符替换为转义后的安全值,从而有效防止 SQL 注入攻击。

第4步:启动并提交事务

对于涉及多个相关联数据的修改,应使用事务包裹。
1. 调用 $db->con->beginTransaction() 启动事务。
2. 依次执行多条 UPDATE 或 INSERT 语句。
3. 若所有步骤成功,调用 commit() 提交更改,使其永久生效。

第5步:异常回滚机制

将事务操作置于 try-catch 块中。如果在执行过程中发生任何异常(如语法错误、主键冲突等),程序跳转至 catch 分支,调用 rollBack() 撤销自 beginTransaction 以来的所有操作,确保数据库状态保持一致。

注意:只有使用 InnoDB 存储引擎的表才支持事务。MyISAM 引擎不支持,相关操作将被忽略或导致不可预知的结果。

总结

通过上述封装类和事务示例,可以看到 PHP PDO 提供了强大且安全的数据库操作能力。合理的封装能减少冗余代码,而事务机制则保障了复杂业务场景下的数据完整性。在实际开发中,建议始终使用预处理语句替代字符串拼接,并根据业务需求选择是否开启事务。

以上就是 PHP PDO 简单封装及事务操作的详细内容,更多关于 PHP 数据库编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表