从Select语句中有效获取行数

时间:2011-12-14 05:49:40

标签: php mysql pdo

直到最近,在对数据库进行SQL查询之前,我一直在使用mysql_real_escape_string()来修复大部分变量。一位朋友说我应该使用PDO的预备语句,所以在阅读了一些关于它们之后,我现在转而使用它们。

到目前为止,我只遇到一个问题,就是切换SELECT语句返回的行数。有时在我的代码中,我会运行一个SQL查询,然后计算从SELECT语句返回的行数。根据结果​​集是否返回,我会采取不同的操作。有时我确实需要使用它的结果集。 MySQL允许我在mysql_fetch_assoc()之后直接转到mysql_num_rows(),没有任何问题。但是,PDO似乎没有像mysql_num_rows()那样的东西。

我一直在阅读有关SO的一些回复,它们给了我一个解决方案,要么在SQL语句中使用COUNT(),要么在结果集上使用PHP函数count()。如果我在某些地方不需要结果集,COUNT()在SQL语句中可以正常工作,但是,有些人提到在结果集上使用count()效率很低。

所以我的问题是,如果我需要计算所选择的行数(如果有的话),我应该怎么做呢,然后用结果集运行一个脚本?在这种情况下,在结果集上使用count()是唯一的方法,还是有更有效的方法来做事?

下面是一个与我以前的SQL代码类似的简短示例:

$query=mysql_query('SELECT ID FROM Table WHERE Name='Paul' LIMIT 1);

if(mysql_num_rows($query)>0)
{
  print_r(mysql_fetch_assoc($query));
}
else
{
  //Other code.
}

感谢。

修改

我知道你在计算结果集之前在语句中使用了fetchAll()(这给了我需要的东西),但我只想找出最有效的方法。

2 个答案:

答案 0 :(得分:2)

$stmt->rowCount();

http://php.net/manual/en/pdostatement.rowcount.php

必须提取行(缓冲到内存中或迭代)以使其工作。将pdo驱动程序配置为自动执行此操作并不罕见。

答案 1 :(得分:1)

您必须使用Count()。您可以运行两个查询,例如

SELECT COUNT(ID) FROM Table WHERE Name='Paul' 

您已获得计数,然后使用select子句

运行查询
SELECT ID FROM Table WHERE Name='Paul' LIMIT 1
如果你像Count()一样使用它,那么

COUNT(ID)函数根本不是低效的,因为很可能id是主键并且有一个索引。 MYSQL甚至不必访问该表。