5

我有这个示例查询:

$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,但不建议这样做,因为我有一个连接多个表的查询并且会非常慢。还有其他解决方案吗?

谢谢

4

3 回答 3

5

我收回它,看起来你可以使用光标方向内容来选择结果......示例代码来了......我还没有尝试过,所以你可能需要玩一下。这也是基于这样的假设,即 a 的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;
}

我不认为你可以倒回一个语句......假设这些块不是由一堆中间逻辑 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++;
}
于 2012-12-31T15:19:58.240 回答
1

你能用一个do...while循环来代替吗?

$STH->setFetchMode(PDO::FETCH_ASSOC);
$list = $STH->fetch();
$first_id = $list['id'];

do {
  $id = $list['id'];
  echo $id;
} while ($list = $STH->fetch());
于 2012-12-31T15:16:49.157 回答
1

您可以获取所有结果,然后将其作为数组处理。因此,例如,您可以将第一个结果从前面移开,然后遍历任何其他行:

<?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
}
于 2012-12-31T15:17:27.923 回答