【发布时间】:2020-02-14 19:09:43
【问题描述】:
在我看到的大多数 SQL PHP 准备语句示例中,例如:
$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,
]);
字段名称几乎重复... 4 次!
- 在
INSERT INTO(...)之后:task_name(SQL 中的列名) - 在
VALUES(...)之后::task_name - 在字典键中一次:
:task_name - 在字典中的一次值:
$taskName(局部变量)
我知道每个都有不同的含义,但是这种冗余确实很烦人:如果我们想更改查询中的某些内容,我们必须更改 4 次!
如何更好地准备好语句,避免 PHP 中出现如此多的冗余?
【问题讨论】:
-
不要使用名称,而是使用占位符 (?)。就我个人而言,我喜欢使用这些名称,因为它非常清楚事物之间的关系。
-
@Dave 你能举个例子吗?当变量很多时,冗余变得可见。
-
这就是您使用ORM (Object-Relational Mapper) 的原因。您无需手动构建讨厌的、容易注入的 SQL 字符串,而是使用适当的对象并设置它们的属性和状态,然后告诉 ORM 持久化更改,它会为您生成并执行所有 SQL。
-
构建您自己的 CRUD 对象,将您的数据库对象注入其中。然后您的代码可以调用您自己的自定义
update()方法。然后,您可以看到$tableName->update($id, [‘field’=>’value’]之类的东西,而不是所有让您烦恼的东西 -
我会努力解决的;不知道我有多少时间。哦,我的意思是插入,可以像
$tableName->insert(['field1'=>'value1','field2'=>'value2']);
标签: php sql sqlite prepared-statement sql-insert