【发布时间】:2014-07-19 05:18:36
【问题描述】:
我有以下代码:
public function getDefinitions($wordID) {
$query = $this->dbc->prepare('SELECT * FROM definitions WHERE wordID = ?');
$query->bind_param('i', $wordID);
$query->execute();
// ...
$query->close();
return $result;
}
这似乎会为每次调用重新创建prepared statement。这似乎没有利用准备好的陈述的全部好处。特别是在这些准备语句是stored server side 的情况下。这是真的吗?
如果是这样,我应该存储准备语句(在这种情况下作为属性)以在调用之间保持它。有没有办法在请求之间保留准备好的语句?我假设这本质上是一个存储过程?
目前我正在使用 MySQLi。如果我使用其他驱动程序(例如 PDO),请注意任何 API 差异。
【问题讨论】:
-
我会说持久化 $query 会很有意义,否则你不会从使用准备好的语句中获得任何好处,特别是如果你知道你将在同一次执行中多次调用它一个脚本。
-
您确实获得了一个好处,那就是使用绑定变量;但是持久化准备好的语句的一种简单方法可能是使 $query 成为静态的
-
除了占位符/参数之外,真正应该使用准备好的语句的唯一时间是您要一遍又一遍地使用 SAME 查询。准备一次性查询的额外开销绝对是“无用的”。但是正确使用占位符来防止 sql 注入攻击大大超过了开销。
-
@Marc B,明白了。是否有替代准备好的语句,但仍提供占位符的好处?
-
另一方面,说到 native 准备好的语句,肯定有一种称为“模拟准备好的语句”的替代方案,它利用了占位符的思想,无需两次准备。它在许多库中实现,从 PDO 开始。
标签: php pdo mysqli prepared-statement