2013-05-18 46 views
0

從mysql切換到PDO我注意到提取方法改變了PDO對象本身! 例如:PDO提取方法改變pdo對象本身

$res=$ps->fetchAll(); 
echo($res[0]['Mail']); //it'ok 

//now i re-call the fetch method 
$res=$ps->fetchAll(); 
echo($res[0]['Mail']); //no result! 

爲什麼會發生這種情況?在mysql中我從來沒有見過這個東西

+0

你爲什麼記得取法? –

+0

你有沒有試過'mysql_fetch_assoc'超出結果集的末尾......? – deceze

回答

4

該對象仍然包含您的數據,但它維護一個指向當前記錄的內部指針。每次從結果集中獲取記錄時,指針都會前進到下一行。

fetchAll()的情況下,指針已經前進到結果集的末尾,因此隨後的fetchAll()調用不返回任何結果。

如果您需要再次調用fetchAll(),則可以將指針倒回至結果集的開頭。這可以在緩衝的查詢來實現:

$ps->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1); 
$ps->rewind(); 
$ps->fetchAll(); 
1

fetch回報所有剩餘的/可用行,如果沒有更多的行可將返回FALSE;和fetchAll將單次嘗試返回所有可用的行,隨後的調用將返回FALSE,因爲結果集中沒有剩餘數據。

我們可以在上面的例子中重新使用數組$res

0

你需要知道什麼呢fetch*
當你火了,從PDO查詢數據庫,該數據庫對數據進行篩選放在一起結果集要求您提供的數據。這可能涉及從硬盤讀取數據,將其存儲在內存中並保留一段時間。對於大型結果集,這些是花費的重要資源。當您從PDO獲得fetch()時,會將單個結果從數據庫的內部緩衝區複製到PHP的/ PDO的內部緩衝區,並以數據數組的形式返回給您。當您再次致電fetch()時,您會得到下一個結果等等。

一旦獲取結果,數據庫就可以釋放該內存。客戶端(你)獲得了它要求的數據,因此數據庫可以將其從內存中移除。你不能再次fetch()相同的數據;出於效率原因。

fetchAll()一次性提取所有結果並返回一個大數組。這與以下內容相同:

$result = array(); 
while ($row = $pdo->fetch()) { 
    $result[] = $row; 
} 

你也不能再這樣做。

mysql,這是與此相同:

$result = array(); 
while ($row = mysql_fetch_assoc($resultSet)) { 
    $result[] = $row; 
} 

你不能再這樣做,要麼。


可以倒帶結果集指針在數據庫中明確告訴它再次讀取它已經看過,但是這可能是非常低效的,應該避免。爲了讓您的應用程序快速運行,您應該只根據需要來回傳輸儘可能少的數據,並儘可能將盡可能少的數據存儲在內存中。

+0

所以你說這是更好地使用更少的獲取possibile? – Sonia

+0

實際上,您不應該多次獲取相同的數據,因爲每次獲取都會對數據庫服務器造成負擔,並且可能比讀取之前讀取的數據慢幾個數量級。 – deceze

+0

是的,所以最好做fetchAll一次,對吧? – Sonia