题
我想写一个迭代的成果,从一个公设辩护人发言,但我找不到任何方式卷的第一行。我想要避免的开销调fetchAll和储存的所有结果的数据。
// first loop works fine
foreach($statement as $result) {
// do something with result
}
// but subsequent loops don't
foreach($statement as $result) {
// never called
}
是否有某种方式的重置的声明或寻求第一行的?
解决方案
我很确定这是依赖于数据库的。因此,您应该尽量避免这种情况。但是,我认为您可以通过启用缓冲查询来实现您的目标。如果这不起作用,您始终可以使用 使用fetchall 代码>
。这两种解决方案都会对您的应用程序性能产生影响,因此如果结果集很大,请三思而后行。
其他提示
我写的这个小班包装了PDOStatement。它仅存储获取的数据。如果这不起作用,您可以移动缓存以读取和写入文件。
// Wrap a PDOStatement to iterate through all result rows. Uses a
// local cache to allow rewinding.
class PDOStatementIterator implements Iterator
{
public
$stmt,
$cache,
$next;
public function __construct($stmt)
{
$this->cache = array();
$this->stmt = $stmt;
}
public function rewind()
{
reset($this->cache);
$this->next();
}
public function valid()
{
return (FALSE !== $this->next);
}
public function current()
{
return $this->next[1];
}
public function key()
{
return $this->next[0];
}
public function next()
{
// Try to get the next element in our data cache.
$this->next = each($this->cache);
// Past the end of the data cache
if (FALSE === $this->next)
{
// Fetch the next row of data
$row = $this->stmt->fetch(PDO::FETCH_ASSOC);
// Fetch successful
if ($row)
{
// Add row to data cache
$this->cache[] = $row;
}
$this->next = each($this->cache);
}
}
}
请参阅此演示文稿中的幻灯片31 ,您可以执行<代码> $ statement-&gt; rewind()如果它适用于缓冲查询。如果您使用mysql,则可以使用 PDO_MYSQL_ATTR_USE_BUFFERED_QUERY
来模拟缓冲查询:
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
@NoahGoodrich指向你。以下是一个始终有效的示例:
$it = new ArrayIterator($stmt->fetchAll());
你可能会想看看一些PHP SPL类可以扩展到提供类似数组访问的对象。
- 标准PHP库(SPL) 我具体 建议你看看 ArrayIterator,ArrayObject, 也许是迭代的接口。
- 简单的 教程
- 另一个 快速教程
很久以前问过,但目前还有另一种解决方案。
方法 PDOStatement :: fetch()
可以使用 PDO :: FETCH_ORI _ *
常量之一接收第二个参数,即光标方向。这些参数仅在 PDOStatement
使用atribute PDO :: ATTR_CURSOR
创建为 PDO :: CURSOR_SCROLL
时有效。
这样您可以按如下方式导航。
$sql = "Select * From Tabela";
$statement = $db->prepare($sql, array(
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
));
$statement->execute();
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_NEXT); // return next
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_PRIOR); // return previous
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST); // return first
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_LAST); // return last
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_ABS, $n); // return to $n position
$statement->fetch(PDO::FETCH_BOTH, PDO::FETCH_ORI_REL, $n); // return to $n position relative to current
docs 中的更多信息a href =“http://php.net/manual/en/pdo.constants.php”rel =“nofollow”> PDO预定义常量。
注意:使用 PDO :: FETCH_BOTH
因为是默认设置,只需为您的项目自定义它。