简介
准备语句提供了一种强大的技术来防止 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中文网其他相关文章!