thinkphp 原生 sql 查询中,`query` 用于执行 select 等返回数据的语句并返回结果集数组,而 `execute` 用于执行 insert、update、delete 等不返回数据的语句并返回受影响行数。选择依据是 sql 语句是否期望获取数据:需要读数据用 `query`,只需写操作确认成功与否用 `execute`。

query() 处理 SELECT 语句的具体用法
query() 方法专门用于执行查询类 SQL 语句,其核心功能是返回一个包含所有匹配记录的二维数组。如果查询没有匹配到任何数据,该方法会返回空数组 [],而不是 null 或 false(除非发生严重数据库连接错误)。在实际开发中,当你需要遍历结果集进行展示或进一步逻辑处理时,必须使用此方法。例如,获取用户列表或统计信息时,调用 query() 能直接拿到结构化数据供后续代码使用。

$result = Db::query('SELECT id, name FROM user WHERE status = ?', [1]);
// $result 是一个二维数组,如: [["id"=>1, "name"=>"Alice"], ["id"=>2, "name"=>"Bob"]]
foreach ($result as $row) {
echo $row['name'];
}
execute() 处理增删改语句的具体用法
execute() 方法用于执行非查询类的 SQL 语句,包括 INSERT、UPDATE、DELETE 以及 CREATE、DROP 等 DDL 语句。它的返回值不是数据内容,而是整数类型的受影响行数(affected rows)。对于 INSERT 和 UPDATE,这表示成功插入或更新的记录数;对于 DELETE,表示被删除的记录数。如果语句执行失败,通常会抛出异常或返回 false(取决于配置),但在成功执行的情况下,你可以通过返回值判断操作是否真正改变了数据库状态。这是验证写入操作是否生效的关键指标。
$count = Db::execute('INSERT INTO user (name, email) VALUES (?, ?)', ['Charlie', 'charlie@example.com']);
// $count 为 1,表示成功插入了 1 条记录
$count = Db::execute('UPDATE user SET status = 0 WHERE id = ?', [1]);
// $count 为 1,表示更新了 1 条记录
$count = Db::execute('DELETE FROM user WHERE id = ?', [2]);
// $count 为 1,表示删除了 1 条记录
基于参数绑定在 query 与 execute 中的安全性差异
在使用原生 SQL 时,参数绑定是防止 SQL 注入的核心手段。query 和 execute 都支持通过数组传递参数,底层机制相同,均会将参数转义后拼接进 SQL。然而,开发者常误以为 execute 更安全而忽略 query 的绑定,这是错误的。两者在安全性上无本质区别,关键在于是否使用了占位符 ? 或命名占位符 :name 而非直接拼接变量。若不使用参数绑定,无论调用哪个方法都会导致严重的 SQL 注入漏洞。因此,在编写复杂查询或动态条件时,应始终确保使用参数化查询,并根据是否需要返回数据来选择对应的方法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











