ThinkPHP ORM 的预编译语句支持
在 ThinkPHP 框架中,ORM 层(即 ThinkORM)**默认启用了 PDO 预编译语句**(Prepared Statement)来执行所有 SQL 查询,包括增删改查操作。这一特性由 PDO 驱动自动处理,无需开发者手动干预。
安全与性能保障
使用预编译语句的主要优势:
1. **SQL 注入防护**:所有用户输入会被作为参数绑定,而非直接拼接在 SQL 中。
2. **性能优化**:数据库可以缓存查询计划,提高重复查询效率。
验证方法
如果你查看 ThinkPHP 的源代码,可以在 `thinkphp/library/think/db/Query.php` 类中找到相关实现:
php
// ThinkPHP 源码片段(简化版)
protected function execute(string $sql, array $bind = []): PDOStatement
{
// 创建 PDO 预处理语句
$statement = $this->connection->getPdo()->prepare($sql);
// 绑定参数
foreach ($bind as $key => $value) {
$statement->bindValue($key, $value[0], $value[1]);
}
// 执行查询
$statement->execute();
return $statement;
}
使用示例
无论你使用哪种查询方式,预编译语句都会自动生效:
php
// 增:添加新记录
User::create([
'name' => $username, // 自动参数化
'age' => $age // 自动参数化
]);
// 删:删除记录
User::where('id', $id)->delete(); // $id 会被参数化
// 改:更新记录
User::where('id', $id)
->update(['status' => 1]); // 所有更新值都会被参数化
// 查:查询记录
User::where('age', '>', 18)
->find(); // 条件表达式自动参数化
手动执行原生 SQL
如果你需要执行原生 SQL,同样可以通过参数绑定确保安全:
php
Db::execute('UPDATE users SET name = :name WHERE id = :id', [
'name' => $name, // 参数绑定
'id' => $id // 参数绑定
]);
总结
ThinkPHP 的 ORM 层在底层**始终使用预编译语句**处理所有数据库操作,这是框架内置的安全机制。开发者无需手动配置,只需遵循 ORM 的 API 规范即可获得 SQL 注入防护和性能优化的双重保障。