2014-01-07 16 views
-1

我意識到有很多帖子都是從選擇中獲取PDO中的行數。PDO - 行數 - 這是最短路嗎?

但是...我試圖儘可能少的行數,並且仍然可以在循環中使用記錄集。這怎麼樣?

$sql = "SELECT Name FROM my_table WHERE LastName = 'Wilson' "; 

$stmt = $conn->query($sql); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$row_count = count($stmt->fetchAll()); 
$stmt = $conn->query($sql); 

foreach ($stmt as $row) { 

    echo $row['Id']; 

} 

我試過這麼多的組合...但我似乎必須在$語句= $ conn->查詢($ SQL)翻倍;能夠使用循環後?這可以改善嗎?

+1

總之一句話:糟透了。你執行兩次相同的查詢,並且將所有數據都提取兩次,一次甚至全部存入內存。 – deceze

+1

這很糟糕。你是1)做'SELECT *',這是不好的形式,2)你將所有的數據拉兩次。只需使用COUNT(*)來獲取行數。 –

+0

...並且沒有'WHERE'子句,如果這些表正在運行INNO引擎,那麼這真的很糟糕。 – DanMan

回答

1

我不明白這整個rowcount()的事情。

我有一個活的網站,如果我這樣做:

$stmt = $pdo->query("SELECT type FROM vehicles WHERE del='N'"); 
echo $stmt->rowcount(); 

它返回46,這是正確的。

這對我的開發服務器和我的託管服務器都正常工作。

據我所知,只有在查詢中使用COUNT()時,rowcount()才起作用。毫無疑問,如果我錯了,有人會糾正我。

+0

當你使用COUNT()時,它仍然可以正常工作:它會告訴你'1',因爲聚合查詢返回1行。它總是工作一樣。 – deceze

+0

@deceze:是的,你非常正確 - 「不起作用」對我來說是一個糟糕的選擇,我應該編輯一下,說「不像有些人所期望的那樣」。 ;) –

+0

你是對的。我連接到一個MySQL數據庫,它工作正常!我很感謝你的回答。 –

0

什麼像這樣

$sql = "SELECT * FROM my_table "; 

$stmt = $conn->query($sql); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$results = $stmt->fetchAll(); 
$row_count = count($results); 

foreach ($results as $row) { 

    echo $row['Id']; 

} 
0

這裏就不多說了。您可以獲取結果數據,然後計算PHP中的行數,或者存儲查詢並運行兩次 - 一次使用實際的SELECT,一次使用SELECT COUNT(*)。如果查詢使用索引,這沒什麼大不了的。