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

时间:2011-07-15 20:53:11

标签: php pdo

示例:

$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

那么有没有办法重用语句对象?

3 个答案:

答案 0 :(得分:4)

当没有可用的行时,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);

答案 1 :(得分:2)

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

但是考虑一下这个问题:如果你已经有fetched all PHP Manual,为什么你期望第二次获取所有语句仍然可以返回一些内容?

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有一个前进的游标。一旦结束,除了close the cursor PHP Manual之外你无能为力并再次执行。

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

但我认为您不希望/需要为您的代码实际执行此操作。相反,获取所有列,然后通过索引在返回的数据中访问它们:

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

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

答案 2 :(得分:0)

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

然后使用$ array你想要的。