gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:37:44 24 4
gpt4 key购买 nike

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

所以问题很简单,如果我迭代相同的 $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 引擎/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 ​​次?或者会注意到它是同一个查询,只是“跳转”那个?

最佳答案

您的代码只准备查询一次,因为在第一次循环迭代后,它不是 NULL,因此条件 block 将不会运行。但是每次通过循环检查条件是浪费时间。

但要回答您的问题,如果您准备() 同一个查询,它确实会做多余的工作,即使该查询与您之前准备的查询相同。所以你应该避免这种情况。

但是您根本不需要在循环内部进行准备。在开始循环之前准备一次,并为参数绑定(bind)一个变量。您不需要在循环中每次都进行绑定(bind),只需更改该变量的值即可。

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

我不确定您是否可以绑定(bind)变量并将其用作循环变量,可能存在范围冲突。

针对此查询的另一个建议:为什么不只运行一个查询来搜索值列表?

$list = implode(",", array_fill(1, count($arr), "?"));
$query = "SELECT * FROM something WHERE id IN ( $list )";
$this->queryCheckAccess = $this->dbLink->prepare($query);
$this->queryCheckAccess->execute($arr);

PS:你还应该检查错误。如果启用 PDO 错误模式 EXCEPTION,那么错误将自动抛出异常。如果您不启用该模式,则需要检查 prepare() 和 execute() 的返回值,如果有错误则返回 false

关于php - 避免多次准备相同的 PDO 语句的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com