2012-12-31 7 views
5

なしMYSQL PDOで2回をフェッチします。ループは再びすべての行を表示するようにしながら、私が使用は、どのように私はこのサンプルクエリを持ってはfetchAll

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

:だから私は、最初の行を取得するには、次の使用

while ($list = $STH->fetch()) {  
$id = $list['id']; 
echo $id; 
} 

を今しばらくは、最初の行をスキップし、私はそれが表示されるようにしたいです。 mysql_data_seekに相当するポインタが最初の行に再びリセットされますか?私はfetchallが使用できることを知っていますが、それはメモリや無駄に悪いです。また、クエリを実行して1に制限することもできますが、複数のテーブルを結合するクエリがあり、非常に遅いため、これはお勧めできません。他の解決策はありますか?

答えて

5

私はあなたが結果を選択し、カーソルの向きをあらわす定数を使用することができるようにその背中が見える取ります...サンプルコードが来ます...私はこれを試していないので、ちょっと遊ぶ必要があるかもしれません。これは、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の束によってsepratedアレントこれらのブロックを仮定。

+0

他の目的のために使用するために、最初の行を表示する必要があるすべての行を使用する配列にする必要があります...ありがとう:) –

+0

あなたの例では 'id'のみを選択しました。 .. – prodigitalson

+0

これは問題を説明する単純なクエリです。クエリはそれよりもはるかに大きいです –

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()); 
+0

これはクエリのORDER BYを無視します。ありがとう:) –

+0

@Michael - 本当ですか?私はこれがクエリの 'order by 'にどのような影響を与えるのか見ていません... –

+0

なぜこれが起こるのかわかりません。descで順序付けしていますが、今は昇順で表示されます –

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 
} 
+0

私は彼具体的には 'fetchall'の使用を避けた答えがありました –

+0

しかしfetchALLは他人の経験からメモリを無駄にしています...ありがとう:) –

+0

@MichaelSamuelなぜですか? 'fetchAll()'が "メモリ不足"や "無駄"であるというベンチマークの証拠がありましたか、あるいは他の場所で読んでいるだけですか?私は 'fetchAll()'が複数の 'fetch()'より優れていると思います。 –

関連する問題