php数据库重构核心是用pdo替代废弃的mysql_*函数,分离数据访问层(dao/repository),强制使用预处理防注入,并通过配置化连接、异常模式和查询构建器提升可维护性。

PHP 数据库代码重构不是重写,而是让数据访问更清晰、可测、可维护。核心是分离关注点、减少耦合、提升抽象层级。
用 PDO 或 MySQLi 替代已废弃的 mysql_* 函数
mysql_* 系列函数在 PHP 7.0 中已被彻底移除,继续使用会导致运行时错误。PDO 是首选,它支持预处理语句、多数据库驱动、事务控制,并天然防止 SQL 注入。
- 将
mysql_connect()、mysql_query()全部替换为 PDO 实例 +prepare()/execute() - 连接信息(host、dbname、user、pass)应从配置文件或环境变量读取,避免硬编码
- 启用 PDO 的异常模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),让错误可捕获而非静默失败
把 SQL 逻辑从业务代码中抽离出来
直接在控制器或模型方法里拼接 SQL 字符串,会快速导致难以调试、无法复用、测试困难。应明确划分“数据访问层”(DAO 或 Repository)。
- 为每个业务实体(如 User、Order)建立对应的 DAO 类,只负责 CRUD 和基础查询
- SQL 语句尽量写在 DAO 内部,不暴露给上层;上层只调用语义化方法,如
findActiveOrdersByUserId($id) - 避免在 DAO 中处理业务规则(如权限校验、状态流转),这些属于 Service 层职责
用预处理语句代替字符串拼接
哪怕用了 PDO,如果仍用 "SELECT * FROM users WHERE id = " . $id 这类拼接,就等于没防注入。预处理不是可选项,是必须项。
立即学习“PHP免费学习笔记(深入)”;
- 所有用户输入参与的查询,都必须使用占位符(
?或命名参数:name) - 批量操作(如插入多条记录)可用
execute($params)循环,或用INSERT ... VALUES (...), (...)配合批量绑定 - 动态字段或表名不能用预处理,需白名单校验后拼接,例如排序字段只允许
['id', 'created_at', 'status']
引入查询构建器或轻量 ORM(按需)
纯手写 SQL 在复杂查询(JOIN、子查询、分页)中易出错且难维护。不一定要上 Laravel Eloquent,但可考虑 Query Builder 类封装。
- 用 SqlQueryBuilder 或自建简易 Builder,统一生成安全 SQL
- 对简单项目,一个带链式调用的
QueryBuilder类(select/from/where/orderBy/limit)已足够降低出错率 - 若团队熟悉 Doctrine DBAL,它比原生 PDO 更健壮,又比完整 ORM 更轻量,适合过渡阶段
重构不是一次性工程,建议从高频出错、高变更率的数据模块开始,每次只改一个 DAO,配合单元测试验证行为不变。关键是让每行数据库代码都清楚地回答三个问题:谁在用它?它依赖什么?它保证了什么?











