避免 PHP SQL 準備語句中的程式碼重複
在大多數 PHP SQL 準備語句範例中,欄位名稱會重複多次。如果需要進行更改,這種重複可能會很冗長且容易出錯。以下是一些最小化冗餘的解決方案:
原始PHP
省略查詢中的fields 子句並使用位置佔位符,您可以減少冗長。確保所有表列都有值,即使它們為空或預設值。
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
輔助函數
為插入建立輔助函數可以進一步簡化程式碼。此函數應警惕透過欄位名稱進行的 SQL 注入。
function prepared_insert($conn, $table, $data) { $keys = array_keys($data); $keys = array_map('escape_mysql_identifier', $keys); $fields = implode(",", $keys); $table = escape_mysql_identifier($table); $placeholders = str_repeat('?', count($keys) - 1) . '?'; $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)"; $conn->prepare($sql)->execute(array_values($data)); }
Baby 物件關係映射器 (ORM)
此方法使用物件導向程式設計來自動化插入的建立。基底類別包含通用方法,特定表定義為子類別。
public function create($data): int { $fields = $this->makeFieldList($data); $placeholders = str_repeat('?', count($data) - 1) . '?'; $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)"; $this->sql($sql, array_values($data)); return $this->db->lastInsertId(); }
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); echo "Create: $id", PHP_EOL;
這些解決方案透過使用較少的程式碼並避免重複的欄位名稱來消除冗餘。
以上是使用 PHP SQL 準備語句時如何避免程式碼重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!