使用count()来计算PHP中PDO的结果?

时间:2013-01-18 18:10:58

标签: php mysql pdo count

我正在将旧的mysql_X网站转换为使用PDO,到目前为止,这很好(我认为)。但是,我对计算查询结果的可靠性有疑问。

目前,我已经完成了这样的事情(我已经删除了try / catch错误代码,以便更容易阅读):

$stm = $db->prepare("SELECT COUNT(*) FROM table WHERE somevar = '1'");
$stm->execute();
$count = $stm->fetchColumn();

if ($count > 0){
    $stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
    $stm->execute();
    $result = $stm->fetchAll();
}

这样做可能会有愚蠢的问题,我邀请你告诉我是否有,但我的问题是关于减少数据库查询。我注意到如果我删除第一个语句,单独运行第二个语句,然后使用PHP的count()来计算结果,我似乎仍然获得可靠的行数,只有一个查询,像这样:

$stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
$stm->execute();
$result = $stm->fetchAll();

$count = count($result);
if ($count > 0){
    //do whatever
}

这样做是否有任何陷阱?它可靠吗?我的PDO中有任何明显的,愚蠢的错误吗?谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

在MySQL中进行计数是可取的,特别是如果计数值是您感兴趣的唯一结果。将您的版本与等效问题进行比较“杂货店有多少巧克力棒?”

1)在数据库中计算:SELECT count(*) ....开车到商店,计算巧克力棒,记下数字,开车回家,读取纸条上的数字

2)以PHP计算:SELECT * ...。开车去商店。买所有的巧克力棒。把它们送回家。把它们放在起居室的地板上。把结果写在一张纸上。 扔掉巧克力棒。读取纸上的数字。

哪一个更有效/更便宜?如果您的db / table只有几条记录,那就没什么大不了的。当你开始达到数千/数百万条记录时,版本2)绝对是荒谬的,可能会烧毁你的带宽,炸掉你的PHP内存限制,并将你的CPU使用率推到平流层。

话虽这么说,运行两个查询没有意义,一个只计算你可以获得多少记录。这种系统容易受到竞争条件的影响。例如你做你的计数并获得(比方说)1记录。当你去运行第二个查询并获取该记录时,一些其他并行进程已经消失并插入了另一条记录,或者删除了你想要的那条记录。

答案 1 :(得分:0)

在第一种情况下,您使用的是MYSQL,在第二种情况下,您正在使用PHP进行计数。两者都是相同的结果。

答案 2 :(得分:0)

您对查询的使用是正确的。使用LIMIT时会出现唯一的问题,因为COUNT(*)和count($ result)会有所不同。

COUNT(*)将计算查询返回的所有行(假设计数查询相同且不使用LIMIT)

count($ result)将仅计算返回的行数,因此如果使用LIMIT,则只会将结果提升到给定的限制。

答案 3 :(得分:0)

是的,在这个用例中它是可靠的!