mysql_num_rows是否有效和/或标准实践?

时间:2009-07-22 13:36:32

标签: php mysql sqlite

不久前,我正在尝试使用SQLite,试图将我的一些网站移植到使用它而不是MySQL。我很遗憾没有计算结果的函数,比如PHP的mysql_num_rows()。在搜索了一下之后,我发现了this mail list,它说(据我所知)SQLite没有这个功能,因为它效率低下。它声明编写需要知道返回行数的代码是不好的形式。

我通常使用mysql_num_rows来检查空的返回结果。例如:

$query = "SELECT * FROM table WHERE thing = 'whatever'";
$results = mysql_query($query);

if (mysql_num_rows($results)) {
    while ($row = mysql_fetch_array($results)) {
        echo "<p>$row[whatever]</p>";
    }
} else {
    echo "<p>No results found</p>";
}

在SQLite社区中对mysql_num_rows()概念的强烈厌恶让我想知道它是否对PHP中的常规MySQL非常有效。

mysql_num_rows()之外,还有更好的,更可接受的方法来检查PHP中MySQL结果集的大小吗?

编辑: 我不只是使用mysql_num_rows来计算 - 我会使用COUNT查询。在输出所有内容之前,我用它来检查是否有任何结果。这对于显示搜索结果等内容非常有用 - 并不总能保证会有结果。在SQLite世界中,我必须发送一个COUNT查询,检查是否有什么,然后发送SELECT查询以获取所有内容。

3 个答案:

答案 0 :(得分:10)

如果您在mysql_fetch_array()中获得了结果,那么您已经掌握了一些信息。如果没有更多要提取的行(来自php.net),则返回false。

$query = "SELECT * FROM table WHERE thing = 'whatever'";
$results = mysql_query($query);
if($results) {
    $row = mysql_fetch_array($results);
    if($row) {
        do {
            echo "<p>{$row[whatever]}</p>";
        } while($row = mysql_fetch_array($results));
    } else {
        echo "<p>No results found</p>";
    }

} else {
    echo "<p>There was an error executing this query.</p>";
}

答案 1 :(得分:0)

无论您是否实际使用了 SELECT ed,您仍会返回所有行。这是非常低效的,因为你只是丢掉了结果,但你仍然让你的数据库为你完成所有的工作。如果您所做的只是计算,那么您正在做所有的处理。您的解决方案是使用 COUNT(*)。只需将 COUNT(*)交换到您的 SELECT 语句的位置,就可以了。

但是,这主要适用于使用它作为 COUNT 的完全替代品的用户。在您的情况下,使用情况并非真的很糟糕。您只需在循环中手动计算它们(这是SQLite用户的首选解决方案)。

原因在于底层的SQLite API。它doesn't return the whole result set一下子,所以它无法知道有多少结果。

答案 2 :(得分:0)

正如您在邮件列表中所解释的那样。返回行数是低效的,因为您需要分配大量内存来保存整个(剩余)结果集。您可以做的是简单地使用布尔值来测试您是否输出任何内容。

$query = "SELECT * FROM table WHERE thing = 'whatever'";
$results = mysql_query($query);

$empty_result = true;
while ($row = mysql_fetch_array($results)) {
    echo "<p>$row[whatever]</p>";
    $empty_result = false;
}

if ($empty_result) {
    echo "<p>No results found</p>";
}