2012-08-23 54 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()來檢索將返回的行數。然後您的應用程序可以執行正確的操作。