PDO:fetchColumn是否会移动返回结果集的指针?

时间:2011-02-01 04:38:48

标签: php pdo

我最近实施了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())
        {
        ...
        }
    }
}

2 个答案:

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