PDO可以为多个查询重用相同的Statement Handle吗?

时间:2015-10-03 00:02:09

标签: php mysql pdo

我正在使用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连接同时运行的提取循环。

所以我在这里寻找的主要内容是,如果我有两个同时运行的语句,当我继续使用相同的连接时,使用不同的句柄很重要吗?

2 个答案:

答案 0 :(得分:1)

$STHSTH1不是语句句柄,它们只是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();
 }

}