2011-02-01 24 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) 
       { 
       ... 
       } 
      } 
     } 
    } 
}