execute() 執行寫操作(INSERT/UPDATE/DELETE),返回影響行數;
query() 執行讀操作(SELECT),返回數據集陣列。
| 特性 | execute() | query() |
|---|---|---|
| 適用 SQL | INSERT, UPDATE, DELETE, REPLACE, DDL | SELECT, SHOW, DESCRIBE, EXPLAIN |
| 返回值 | int(影響行數) | array(結果集,空時為 []) |
| 執行 SELECT | ❌ 返回總行數,不返回數據 | ✅ 正常返回數據集 |
| 事務支持 | ✅ 可用於事務中 | ❌ 僅讀,不影響事務 |
| 預處理綁定 | ✅ 支持 | ✅ 支持 |
$model = M('MyTable');
// 更新
$affected = $model->execute("UPDATE my_table SET name='aaa' WHERE id=11");
echo "更新了 $affected 行"; // 輸出: 更新了 1 行
// 批量插入
$sql = "INSERT INTO logs (level, message) VALUES " .
implode(',', array_fill(0, 100, "(?, ?)"));
$data = [];
foreach (range(1, 100) as $i) {
$data[] = 'INFO';
$data[] = "Log message $i";
}
$model->execute($sql, $data); // 預處理防注入
$model = M('MyTable');
// 簡單查詢
$users = $model->query("SELECT id, name, email FROM users WHERE status=1 LIMIT 20");
// 返回: [['id'=>1,'name'=>'Tom','email'=>'tom@...'], ...]
// 複雜統計
$stats = $model->query("
SELECT DATE(created_at) as day, COUNT(*) as cnt
FROM orders
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY day
ORDER BY day DESC
");
// ❌ 用 execute 執行 SELECT
$model->execute("SELECT * FROM users"); // 返回總行數,無法獲取數據
// ❌ 用 query 執行 UPDATE
$model->query("UPDATE users SET last_login=NOW()"); // 返回空數組,無法知曉影響行數
execute() 內部調用 `PDO::exec()` 或 `mysqli_query()` 後獲取 `affected_rows`query() 內部調用 `PDO::query()` / `mysqli_query()` 後 `fetchAll()` 獲取全部結果集TP5 引入 `Db::execute()` / `Db::query()` 靜態調用,並新增 `Db::listen()` SQL 監聽、`Db::getLastSql()` 調試,核心語義不變。