直到最近,在对数据库进行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()
(这给了我需要的东西),但我只想找出最有效的方法。
答案 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甚至不必访问该表。