避免多次准备相同的PDO语句的最佳方法?

乔治·弗格

当前,我将准备好的语句保存到一个私有变量中,因为我忽略了它们在深处的真正工作方式,以防万一。

因此,问题非常简单,如果我对相同的对象进行迭代$PDO->prepare(),它将再次准备相同的查询吗?

foreach( $arr as $docid ) {
  if( $this->dbLink === null ) { // PDO resource, saved in the object.
     throw new Exception( 'Must first connect to DB' );
  }
  if( $this->queryCheckAccess === null ) {
    $query = 'SELECT * from something where id = :id';
    $this->queryCheckAccess = $this->dbLink->prepare($query);
  }
  else {
    $result = $this->queryCheckAccess->execute(array(':id'=>$docid));
  }
}

有关系吗?还是DB Engine / PHP足够聪明才能知道它是相同的准备好的语句?

非常感谢。

-----------------编辑--------------

我想我被误解了。

我要问的是,如果我这样做:

$query = 'SELECT * from something where id = :id';
$this->queryCheckAccess = $this->dbLink->prepare($query);
$query = 'SELECT * from something where id = :id';
$this->queryCheckAccess = $this->dbLink->prepare($query);
$query = 'SELECT * from something where id = :id';
$this->queryCheckAccess = $this->dbLink->prepare($query);
$query = 'SELECT * from something where id = :id';
$this->queryCheckAccess = $this->dbLink->prepare($query);

如果我这样做会发生什么:

if( $this->queryCheckAccess === null ) {
  $query = 'SELECT * from something where id = :id';
  $this->queryCheckAccess = $this->dbLink->prepare($query);
}

在第一个示例中,引擎将查询准备4次吗?还是会注意到它是相同的查询,只是“跳转”呢?

杰森OOO

我只是运行类似于您的示例的代码,并启用了MySQL查询日志,我发现所有准备请求都发送到了MySQL服务器

   Prepare  SELECT * FROM test_table WHERE username = ?
   Close stmt   
   Prepare  SELECT * FROM test_table WHERE username = ?
   Close stmt   
   Prepare  SELECT * FROM test_table WHERE username = ?
   Close stmt   
   Prepare  SELECT * FROM test_table WHERE username = ?
   Close stmt

测试代码:

$sth = $dbh->prepare($sql);
$sth = $dbh->prepare($sql);
$sth = $dbh->prepare($sql);
$sth = $dbh->prepare($sql);
$sth = $dbh->prepare($sql);
$sth->bindParam(1, $user);
$sth->execute();

然后,最好的方法是准备一次,然后绑定不同的值然后执行。

$sth = $dbh->prepare($sql);
$user = "test";
$sth->bindParam(1, $user);
$sth->execute();

$user = "test2";
$sth->bindParam(1, $user);
$sth->execute();

$user = "test";
$sth->bindParam(1, $user);
$sth->execute();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何避免PDO准备语句中的转义字符“ \”?

来自分类Dev

PDO准备语句功能

来自分类Dev

PDO准备语句功能

来自分类Dev

PDO 准备语句绑定

来自分类Dev

PDO准备语句搜索错误

来自分类Dev

PHP PDO多重准备语句

来自分类Dev

重写语句或避免使用特定索引的最佳方法

来自分类Dev

避免遗漏包含相同文件的最佳方法是什么?

来自分类Dev

PDO准备语句:替换列的值

来自分类Dev

PDO准备的语句和数组中的bindValues

来自分类Dev

SELECT PDO准备语句中的SELECT

来自分类Dev

具有Int Cast的PDO准备的语句

来自分类Dev

PDO在UPDATE Multiple ID中准备的语句

来自分类Dev

PDO准备的语句插入数据库

来自分类Dev

具有%和限制的PDO准备的语句

来自分类Dev

PHP PDO准备语句参数导致错误

来自分类Dev

具有%和concat的PDO准备的语句

来自分类Dev

检查准备好的语句PDO的结果?

来自分类Dev

在嵌套循环中使用准备好的语句的最佳方法

来自分类Dev

是由编译器优化了相同的语句相同的方法多次调用?

来自分类Dev

当测试调用其他方法的方法时,如何避免多次编写相同的测试

来自分类Dev

避免使用jQuery多次选择相同的选项

来自分类Dev

避免多次在熊猫中编写相同的.loc

来自分类Dev

避免在 appsettings 中多次使用相同的 url

来自分类Dev

Mongo&Express-避免客户端多次触发相同请求的实际方法是什么?

来自分类Dev

重构If语句的最佳方法

来自分类Dev

制作if语句的最佳方法

来自分类Dev

多次执行几乎相同的命令的最佳实践

来自分类Dev

如何避免用PHP SQL预准备语句重复代码?