Php PDO我可以为多个查询重用同一个语句句柄吗?
我使用PDO访问我的数据库,同时使用两个while循环和fetch循环,如下所示:Php PDO我可以为多个查询重用同一个语句句柄吗?,php,mysql,pdo,Php,Mysql,Pdo,我使用PDO访问我的数据库,同时使用两个while循环和fetch循环,如下所示: $DBH = new PDO('mysql:host=localhost;dbname=database;charset=utf8',$dblogin,$dbpass); $sql = 'SELECT * FROM table'; $STH = $DBH->prepare($sql); $STH->execute(); while ($bm_table = $STH->fetch(PDO::F
$DBH = new PDO('mysql:host=localhost;dbname=database;charset=utf8',$dblogin,$dbpass);
$sql = 'SELECT * FROM table';
$STH = $DBH->prepare($sql);
$STH->execute();
while ($bm_table = $STH->fetch(PDO::FETCH_ASSOC))
{
// SQL Query
$sql1 = 'QUERY HERE';
$STH1 = $DBH->prepare($sql1);
$STH1->execute();
// Loops through using different handle, but what if I used STH again?
while ($row = $STH1->fetch(PDO::FETCH_ASSOC))
{
SomeFunction($bm_table,$row);
}
}
正如您在上面看到的,我使用的是不同的语句句柄($STH
,$STH1
等),这是必要的吗?或者我可以只使用一个语句句柄来处理所有事情。我之所以使用多个句柄,是因为使用$STH
的$bm_table
值在我提取$row
时仍将被使用,这不会更改$bm_table
的值或停止提取工作吗?PDO的句柄是如何工作的?特别是在本例中,我使用相同的PDO连接同时运行两个同步的fetch循环
因此,我在这里寻找的主要问题是,如果我有两个同时运行的语句,那么在继续使用同一连接时使用不同的句柄是否重要?
$STH
和STH1
不是语句句柄,它们只是PHP变量。如果不再需要变量的旧值,则可以重新分配变量。但是对于这段代码,您仍然需要旧的值
如果将外部循环中的$STH
分配给第二个prepare()
调用返回的句柄,那么当它返回到循环顶部并重新执行$STH->fetch()
测试时,它将尝试从第二个查询而不是第一个查询中提取。这将立即结束外部循环,因为所有这些行都已被读取
您可以重复使用语句句柄执行相同的查询。当查询具有参数时,这非常有用:
$stmt = $DBH->prepare("SELECT * FROM tablename WHERE id = :id");
$stmt->bindParam(':id', $id);
foreach ($id_array as $id) {
$stmt->execute();
$row = $stmt->fetch();
// do stuff with $row
}
如果我理解正确,你想要的是动态查询?。。。只需在方法上添加一个参数,然后 像这样的。尽管参数不同,您可以任意调用它
Class SampleClass{
public function GetAll($tablename)
{
$sth = $this->prepare("SELECT * FROM $tablename");
$sth->execute();
return $sth->fetchAll();
}
}
这就是准备好的声明的要点。准备一次查询,并根据需要执行多次,输入不同的参数。@Sammitch它们是不同的查询。如果出现错误的a语句,此(此链接:)解决方案可帮助您同时运行多个语句,它不执行任何其他语句Hey@Barmar所以只是为了澄清,所以只是为了澄清第二次我从循环内覆盖STH变量,它将中断外部循环的获取?所以我对不同变量的使用是正确的,我应该继续这样做吗?在这种情况下,我总是希望外部循环执行SQL“SELECT*FROM table”,但如果我在循环中更改某个内容以使用另一个快速SQL命令,它将完全中断外部循环上的某个。只要有逻辑地想一想。每次通过循环时,它都执行
$STH->fetch()
,并测试其结果。如果您更改$STH
包含的内容,则会影响$STH->fetch()
返回的内容。谢谢@Barmar。那么,为了澄清在我运行fetch时,它在$STH变量中存储了什么?它是如何跟踪其上的每一行的?在本例中,STH和object不是我调用fetch方法时使用的吗?$STH
包含一个PDOStatement
对象。该对象保存特定查询的状态。您可以将其视为一个包含数组和数组中当前索引的对象。每次获取时,它都会返回索引处的元素并将其递增。