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

カーソルの向きの定数を使用して結果を選択できるように見えます...サンプルコードが来ます...私はこれを試したことがないので、少しプレイする必要があるかもしれません。PDO::FETCH_ORI_FIRSTこれは、actが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 に答える