2011-02-01 5 views
1

私は最近PDOを実装して、クエリ結果に最初の行がないことに気付きました。これはおそらくfetchColumn()が最初の行を取得し、ポインタを2番目の行に移動してwhile()ループが2番目の行から開始するためです。正しいですか?もしそうなら、どうすればそれを回避し、次のコードブロックを改善できますか?PDO:fetchColumnは返された結果セットのポインタを移動しますか?

$STH = $DBH->prepare("SELECT * FROM users"); 
$result = $STH->execute(); 

if (!$result) 
    { 
    return false; 
    } 
elseif($STH->fetchColumn()>0)//counterpart of mysql_num_rows() 
    { 
    while ($row = $STH->fetch()) 
     { 
     ... 
     } 
    } 
} 

答えて

1

これは間違いありませんか?

はい。また、fetchColumn()mysql_num_rows()と等価ではありません。代わりに、fetchColumn()は、現在の行の索引付き列値(デフォルトは索引0)を取得し、想定通りにカーソルを進めます。

クエリで返される行の数が必要な場合は、fetchColumn()を使用して同じ条件でSELECT COUNT(1) ...クエリを発行することをお勧めします。

このマニュアルページの例#2を参照してください - http://www.php.net/manual/en/pdostatement.rowcount.php


例えば

$stmt = $DBH->query('SELECT COUNT(1) FROM users'); 
// using a straight PDO::query() call as a prepared statement would be 
// overkill for these queries 

if ($stmt->fetchColumn() == 0) { 
    return false; 
} 

$stmt = $DBH->query('SELECT * FROM users'); 
while ($row = $stmt->fetch()) { 
    ... 
} 
+0

私が何を見ます意味はありますが、これは理想とはかけ離れており、すべてのクエリを倍増しています。 – bart

+0

@bart thems the breaks。実際に行数を確実に取得する他の方法はありません。 – Phil

+0

あまりにも厳しいdownvote :( – Phil

1

を周りグーグルた後、私はこの解決策を考え出した:

$STH = $DBH->prepare("SELECT * FROM users"); 

if(!$STH) 
    { 
    $error = $DBH->errorInfo(); 
    } 
else 
    { 
    $result = $STH->execute(); 

    if($result===false) 
     { 
     return false; 
     } 
    else 
     { 
     $rows = $STH->fetchAll(PDO::FETCH_ASSOC); 

     if(count($rows) > 0) 
      { 
      foreach ($rows as $row) 
       { 
       ... 
       } 
      } 
     } 
    } 
} 
+0

'PDOStatement :: fetchAll()'を使用するときに大きな結果セットについて注意してください。 – Phil

関連する問題