Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO我可以为多个查询重用同一个语句句柄吗?_Php_Mysql_Pdo - Fatal编程技术网

Php PDO我可以为多个查询重用同一个语句句柄吗?

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

我使用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::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
对象。该对象保存特定查询的状态。您可以将其视为一个包含数组和数组中当前索引的对象。每次获取时,它都会返回索引处的元素并将其递增。