我最近实施了PDO并注意到我的查询结果缺少第一行。这可能是因为fetchColumn()检索第一行并将指针移动到第二行,以便while()循环从第2行开始。这是正确的吗?如果是这样,我该如何避免这种情况并改进以下代码块?
$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())
{
...
}
}
}
答案 0 :(得分:1)
这是对的吗?
是。此外,fetchColumn()
不等同于mysql_num_rows()
。相反,fetchColumn()
检索当前行的索引列值(默认为索引0),并按照假设,使光标前进。
如果您需要计算查询中返回的行数,建议您首先使用相同条件发出SELECT COUNT(1) ...
查询,并使用fetchColumn()
返回计数。
请参阅本手册页的示例#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()) {
...
}
答案 1 :(得分: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)
{
...
}
}
}
}
}