2011-02-01 56 views
1

我最近實現了PDO,並注意到我的查詢結果缺少第一行。這可能是因爲fetchColumn()檢索第一行並將指針移動到第二行,以便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 2011-02-01 07:41:47

+0

@bart thems the breaks。真的沒有其他方法可靠地獲得行數 – Phil 2011-02-01 10:44:09

1

周圍的Googling後,我想出了這個解決方案:

$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) 
       { 
       ... 
       } 
      } 
     } 
    } 
}