准备好的声明是否应该在没有占位符的情况下使用

时间:2016-12-11 19:45:26

标签: php mysql pdo prepared-statement

显然没有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&和你的常识的答案是冲突的,但两者都是正确的,因为我没有说明我是否正在使用仿真模式。但是,我不认为此时从根本上编辑原始问题是合适的,并希望我可以同时选择两个......

2 个答案:

答案 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;
    }
}

显然,在另一个答案中提到了一个案例,但我几乎无法想象可以使用它的情况。