当前,我将准备好的语句保存到一个私有变量中,因为我忽略了它们在深处的真正工作方式,以防万一。
因此,问题非常简单,如果我对相同的对象进行迭代$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次吗?还是会注意到它是相同的查询,只是“跳转”呢?
我只是运行类似于您的示例的代码,并启用了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] 删除。
我来说两句