簡介
準備語句提供了一種強大的技術來防止SQL 注入攻擊並提高查詢效能。然而,建立準備好的語句的傳統方法,如下所示:
$sql = 'INSERT INTO tasks(task_name, start_date, completed_date) VALUES(:task_name, :start_date, :completed_date)'; $stmt = $this->pdo->prepare($sql); $stmt->execute([ ':task_name' => $taskName, ':start_date' => $startDate, ':completed_date' => $completedDate, ]);
在指定欄位名稱時會導致大量冗餘。這種冗餘可能會令人沮喪,尤其是在進行更改或維護程式碼時。本文探討了三種不同的方法,可以減輕這種重複並增強準備好的語句程式碼的可讀性。
原始 PHP
對於基本插入,一種簡單的技術涉及省略查詢中的 fields子句並使用位置佔位符:
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
雖然簡單,但此方法可能不適合
輔助函數
另一種方法是建立一個專門用於處理插入的輔助函數。此函數可以根據提供的欄位名稱和值動態產生查詢:
function prepared_insert($conn, $table, $data) { $keys = array_keys($data); $fields = implode(",", $keys); $placeholders = str_repeat('?,', count($keys) - 1) . '?'; $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)"; $conn->prepare($sql)->execute(array_values($data)); }
使用此輔助函數簡化了插入過程:
prepared_insert($db, 'tasks',[ 'task_name' => $taskName, 'start_date' => $startDate, 'completed_date' => $completedDate, ]);
Baby ORM
最先進的方法涉及實現物件導向程式設計(OOP)解決方案,通常稱為作為「嬰兒ORM」。此方法定義了一個基類,其中包含表操作的通用方法和各個表的特定類:
class UserGateway extends BasicTableGateway { protected $table = 'gw_users'; protected $fields = ['email', 'password', 'name', 'birthday']; }
透過此設置,可以在不明確指定字段名稱的情況下執行插入:
$data = [ 'email' => '[email protected]', 'password' => 123, 'name' => 'Fooster', ]; $userGateway = new UserGateway($pdo); $id = $userGateway->create($data);
OOP解決方案可以顯著提高程式碼可維護性,減少重複,並增強整體開發體驗。
以上是使用 PHP SQL 準備語句時如何減少程式碼重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!