2012-08-23 48 views
0

我正在尝试使用PDO计数项目(在MySql表上)。我在某处读到rowCount在MySql上不起作用。它是否正确?PHP,PDO在mysql上计数

到目前为止,我一直无法让它工作,因为我一直计数= 0。

任何人都可以给我一个想法,所以我可以避免每次回到数据库?我有一个类似于这样一个多个查询:

$items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC"); 
    $count = $items -> rowCount(); 
    $items -> execute(); 
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... } 

我想尽量避免与SELECT COUNT (*)

由于额外的查询!

回答

7

您需要第一个execute查询。只有这样数据库才能完成工作,只有这样你才能计算出找到的结果。

1

rowCount只适用于execute之后。我从来没有在MySQL中的rowCount问题。

使用rowCount很不错,但是如果您要迭代结果,也可以使用自己的计数器变量。

2

为,@deceze指出,

$items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC"); 
$items -> execute(); 
$count = $items -> rowCount(); 
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... } 
0

你可以,如果你使用的是PDO,比如简化代码这么多:

$items = $conn->query("SELECT * FROM item_descr ORDER BY $sortBy DESC")->fetchAll(PDO::FETCH_ASSOC); 

if(count($items)) 
{ 
    // You can count the array to see how many records you got and you can iterate trough it using foreach/for loops 
} 
else 
{ 
    // 0 records returned 
} 

没有必要在这个特殊的预处理语句或者使用rowCount检查是否有任何行。确实,即使使用MySQL,rowCount也会失败,这一切都取决于您是否使用未缓冲的查询。

+0

使用一个班轮如这意味着你马上抽中的所有数据到一个PHP数组,因此到内存中的一次。这可能是一个巨大的性能问题,具体取决于数据量。 – deceze

+0

我没有说它的好坏,它基于OP所要求的 - 当然,它肯定是**是一个潜在的漏洞,然而这是由于查询本身而不是基础的PHP代码。 –

1

我想补充这一切,请参阅PHP文档:

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

特别:

对于大多数数据库,PDOStatement对象:: rowCount时()不不会返回受SELECT语句影响的行数。相反,使用PDO :: query()发出一个SELECT COUNT(*)语句,其谓词与您想要的SELECT语句相同,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后您的应用程序可以执行正确的操作。

并从所述页面的例子:

<?php 
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100"; 
if ($res = $conn->query($sql)) { 

    /* Check the number of rows that match the SELECT statement */ 
    if ($res->fetchColumn() > 0) { 

     /* Issue the real SELECT statement and work with the results */ 
     $sql = "SELECT name FROM fruit WHERE calories > 100"; 
     foreach ($conn->query($sql) as $row) { 
      print "Name: " . $row['NAME'] . "\n"; 
     } 
    } 
    /* No rows matched -- do something else */ 
    else { 
     print "No rows matched the query."; 
    } 
} 

$res = null; 
$conn = null; 
?> 
-1

这个工作对我来说:

$my_query = $db->query('SELECT COUNT(*) AS Count FROM the_table'); 
$c = $my_query->fetch(PDO::FETCH_OBJ); 

return $c->Count; 
-1

PDOStatement对象:: rowCount时()返回只受DELETE,INSERT的行数或UPDATE语句。

对于大多数数据库,PDOStatement对象:: rowCount时()不返回受SELECT语句的行数。相反,使用PDO :: query()发出一个SELECT COUNT(*)语句,其谓词与您想要的SELECT语句相同,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后您的应用程序可以执行正确的操作。