PHP操作数据库的演进:从mysql到PDO与ActiveRecord

周叙
周叙
发布时间:2026-10-13 | 2人浏览过
原创

PHP操作数据库经历了从原生函数到面向对象接口的演变。由于旧版mysql扩展已停止维护并存在安全隐患,现代开发应转向使用PDO或框架封装的ORM/DAO层。本文详细对比了PDO的标准用法以及ActiveRecord在简化开发中的作用。

核心结论

PHP官方已废弃 mysql_* 系列函数(如 mysql_connect),不再推荐使用。对于本地部署的 PHP 项目,推荐使用 PDO (PHP Data Objects) 作为标准数据库接口,它能提供统一的数据访问层,支持多数据库类型,并通过预处理语句有效防止 SQL 注入。

PHP 支持的主流数据库

PHP 具有广泛的数据库兼容性,理论上支持绝大多数主流数据库系统。常见的包括:
- 关系型数据库:MySQL, PostgreSQL, Oracle, SQLite, Microsoft SQL Server, IBM DB2, Sybase。 - 其他类型:InterBase, FrontBase, Empress, Solid, Velocis, Ovrimos 等。
这种广泛的支持得益于 PDO 的统一抽象层和原生的 ODBC 扩展。

避免使用的旧式方法

早期教程中常见的 MySQL 原生操作方式存在严重的安全缺陷(如易受 SQL 注入攻击)且性能较差。以下代码展示了被官方移除的方法,仅供历史参考:

<?php
// ❌ 已废弃的危险写法示例
$link = mysql_connect(HOST, USER, PASS) or die("连接失败"); // 函数已移除
mysql_select_db(DBNAME, $link);
mysql_set_charset("utf8");
$sql = "SELECT * FROM users";
$res = mysql_query($sql, $link); // 无法绑定参数,极易注入
while ($user = mysql_fetch_assoc($res)) {
    echo "<td>{$user['username']}</td>";
}
mysql_free_result($res);
mysql_close($link);
?>

推荐方案:PDO 标准接口

PDO 是 PHP 5.1+ 引入的数据库抽象层。它将数据操作转化为对象形式,提供了以下关键特性:
1. **安全性**:支持预处理语句 (prepared statements) 和参数绑定,彻底解决 SQL 注入问题。
2. **通用性**:一套接口可切换 MySQL、PostgreSQL 等多种驱动。
3. **功能丰富**:支持可滚动游标、LOB 大对象处理等。

第1步:配置连接

通过实例化 PDO 对象建立连接,设置字符集为 UTF-8 以避免乱码。

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

第2步:执行安全查询

使用预处理语句分离 SQL 逻辑与数据内容。

// 准备语句
$stmt = $pdo->prepare('SELECT * FROM users WHERE state = :state');
// 绑定参数并执行
$stmt->execute([':state' => 'active']);
$users = $stmt->fetchAll();

进阶封装:DAO 与 ActiveRecord

在现代 PHP 框架(如 Yii)中,通常会在 PDO 之上进行二次封装,形成更高级的开发模式。

1. DAO (Data Access Object)

DAO 是对底层数据库操作的面向对象封装,直接面向 SQL。它保留了完整的 SQL 控制权,适合复杂业务逻辑或需要精细控制执行计划时。

// Yii DAO 示例
$connection = Yii::$app->db;
$command = $connection->createCommand('SELECT * FROM post WHERE id=:id', ['': ':id]);
$post = $command->queryOne();

2. Active Record (AR)

AR 是一种设计模式,将数据库表映射为类,每一行记录映射为一个对象实例。它进一步抽象了数据库交互,让开发者无需编写 SQL 即可完成增删改查,极大简化代码。

// Yii AR 示例
$customer = new Customer();
$customer->name = 'John Doe';
$customer->save(); // 自动插入数据库,无需拼接 INSERT 语句

选型建议

  • 使用 DAO/PDO 直连:当查询逻辑极其复杂、涉及多表关联子查询、或需要对性能有极致优化时。
  • 使用 ActiveRecord:对于常规的业务 CRUD 操作,AR 能显著减少样板代码,降低出错概率,提升开发效率。

以上就是浅谈PHP的数据库接口和技术的内容,更多关于PHP数据库编程的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表