显然没有SQL注入的威胁,但如果在预准备语句中没有插入变量,是否有使用预准备语句而不是query()
的性能考虑因素?
$sql='SELECT t1.a,t1.b,t2.c FROM t1 INNER JOIN t2 ON t2.id=t1.t2_id';
$stmt=$db->prepare($sql);
while(true) {
...
//Should this be used
$stmt->execute();
//or this, and get rid of the above prepared statement?
$rs=$db->query($sql);
$rs=$stmt->fetchAll();
...
}
EDIT。 Lonesomeday&和你的常识的答案是冲突的,但两者都是正确的,因为我没有说明我是否正在使用仿真模式。但是,我不认为此时从根本上编辑原始问题是合适的,并希望我可以同时选择两个......
答案 0 :(得分:4)
在这个确切的情况下,是的,因为你正在循环。
通过使用预准备语句,您只需将查询发送到MySQL一次,并且只解析一次。如果您每次只发送SQL,它必须重新解析它而不是重新使用相同的代码。
在循环中,您将多次重新执行查询,因此(显微镜下)使用相同的SQL语句会更有效。
答案 1 :(得分:1)
没有应该,但只是出于常识,对于不包含占位符的查询,使用query()
方法是一个合理的想法。
但是,如果您在关闭emulation mode的情况下使用PDO,则上述内容有任何意义。否则,准备/执行对将像单个query()调用一样生效。
但是,鉴于建议关闭仿真模式,我会以这种方式实现一个简单的PDO包装器
class MyPDO extends PDO
{
public function run($sql, $args = NULL)
{
if (!$args) return $this->query($sql);
$stmt = $this->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
显然,在另一个答案中提到了一个案例,但我几乎无法想象可以使用它的情况。