是否可以在PDOStatement对象的单个实例上执行多个fetch()操作


is it possible to make multiple fetch() actions on a single instance of PDOStatement Object?

示例:

$query = $mydb->query('PRAGMA table_info("mytable")');
//variable query has now type of PDOStatement Object
print_r($query->fetchAll(PDO::FETCH_COLUMN,1)); // this result is ok
print_r($query->fetchAll(PDO::FETCH_COLUMN,2)); // but this result gives empty array

那么有什么方法可以重用语句对象吗?

当没有更多行可用时,PDOStatement对象返回false。对fetchAll的调用覆盖了所有行,这些行在随后的任何提取尝试中都会返回false。这限制了语句对象的重用。您可以使用PDOStatement::bindColumn来实现您在示例中尝试的效果。
$query = $mydb->query('PRAGMA table_info("mytable")');
// Variables passed to be bound are passed by reference.
// Columns are based on a *1* index or can be referenced by name.
$query->bindColumn(1, $bound_column1);
$query->bindColumn(2, $bound_column2);
$query->fetchAll();
print_r($bound_column1);
print_r($bound_column2);

当然,您可以重用语句对象。

但请考虑一下:如果您已经获取了所有PHP手册,为什么您希望第二个fetch-all语句仍然可以返回一些东西?

print_r($query->fetchAll(PDO::FETCH_COLUMN,1)); // this result is ok
print_r($query->fetchAll(PDO::FETCH_COLUMN,2)); // but this result gives empty array

PDO有一个向前移动的光标。最后,您只能关闭光标PHP手册并再次执行。

您可以为此重用语句对象。

但我认为您不希望/不需要为您的代码真正做到这一点。相反,获取所有列,然后通过它们的索引在返回的数据中访问它们:

print_r($query->fetchAll(PDO::FETCH_NUM)); // this result is ok

您将在输出中看到,现在每行都有0索引的列编号,因此您可以通过列索引访问返回数据中的列——每行一行。

$array = $query->fetchAll( args );

然后根据需要使用$array。