我正在使用PDO访问我的数据库,并使用两个while循环同时进行循环,如下所示:
$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
等。)这是必要的吗?或者我可以只使用一个语句句柄。我使用多个句柄的原因是使用$bm_table
的{{1}}值,在我抓取$STH
时仍然可以使用,这不会改变$row
的值或者停止提取工作? PDO的句柄如何工作?特别是在这种情况下,我有两个同时使用相同PDO连接同时运行的提取循环。
所以我在这里寻找的主要内容是,如果我有两个同时运行的语句,当我继续使用相同的连接时,使用不同的句柄很重要吗?
答案 0 :(得分:1)
$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
}
答案 1 :(得分:0)
如果我理解你想要的是动态查询?...只需在你的方法上加一个参数......
像这样的事情。尽可能多地使用差异参数调用它。Class SampleClass{
public function GetAll($tablename)
{
$sth = $this->prepare("SELECT * FROM $tablename");
$sth->execute();
return $sth->fetchAll();
}
}