我有这样一个示例查询:
$STH = $DBH->query("SELECT id FROM table");
我想获取第一行,然后循环并显示所有行。因此,我使用以下代码来获取第一行:
$STH->setFetchMode(PDO::FETCH_ASSOC);
$first_row = $STH->fetch();
$first_row = $first_row['id'];
我使用while循环再次显示所有行:
while ($list = $STH->fetch()) {
$id = $list['id'];
echo $id;
}
现在while跳过第一行,我想显示它。是否有一个相当于mysql_data_seek
重置指针再次到第一行?我知道fetchall
可以使用,但它对内存不好,而且很浪费。我也可以运行查询并限制为1,但不建议这样做,因为我有一个连接多个表的查询,并且会非常慢。还有其他解决办法吗?
谢谢
我收回,看起来你可以使用光标方向的内容来选择结果…示例代码即将到来…我还没有尝试过,所以你可能需要玩一点。这也是基于这样一个假设,即PDO::FETCH_ORI_FIRST
的行为类似于data_seek,并将游标留在第一个位置,而不是返回到它之前的位置。
$stmt = $pdo->prepare('SELECT id FROM table', array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
$first = $pdo->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_FIRST);
$first_row = $first['id'];
// other stuff
// first iteration we rewind to the first record;
$cursor = PDO::FETCH_ORI_FIRST;
while (false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC, $cursor))) {
$id = $row['id'];
// successive iterations we hit the "next" record
$cursor = PDO::FETCH_ORI_NEXT;
echo $id;
}
我不认为你可以倒带一个声明…假设这些块没有被一堆中间逻辑分隔,我就在循环中执行。
$STH->setFetchMode(PDO::FETCH_COLUMN); // no need to pull an array
$count = 0;
while ($id = $STH->fetch()) {
if($count === 0) {
$first_row = $id;
}
echo $id;
$count++;
}
您可以使用do...while
循环代替吗?
$STH->setFetchMode(PDO::FETCH_ASSOC);
$list = $STH->fetch();
$first_id = $list['id'];
do {
$id = $list['id'];
echo $id;
} while ($list = $STH->fetch());
您可以获取所有结果,然后将其作为数组处理。因此,例如,您可以将第一个结果移出前面,然后循环遍历任何其他行:
<?php
$sql = "YOUR QUERY";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// get first row
$firstRow = array_shift($rows);
// loop over remaining rows
foreach ($rows as $row) {
// do something
}