從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中我從來沒有見過這個東西
從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中我從來沒有見過這個東西
該對象仍然包含您的數據,但它維護一個指向當前記錄的內部指針。每次從結果集中獲取記錄時,指針都會前進到下一行。
在fetchAll()
的情況下,指針已經前進到結果集的末尾,因此隨後的fetchAll()
調用不返回任何結果。
如果您需要再次調用fetchAll()
,則可以將指針倒回至結果集的開頭。這可以在緩衝的查詢來實現:
$ps->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
$ps->rewind();
$ps->fetchAll();
fetch
回報所有剩餘的/可用行,如果沒有更多的行可將返回FALSE
;和fetchAll
將單次嘗試返回所有可用的行,隨後的調用將返回FALSE
,因爲結果集中沒有剩餘數據。
我們可以在上面的例子中重新使用數組$res
。
你需要知道什麼呢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;
}
你不能再這樣做,要麼。
您可以倒帶結果集指針在數據庫中明確告訴它再次讀取它已經看過,但是這可能是非常低效的,應該避免。爲了讓您的應用程序快速運行,您應該只根據需要來回傳輸儘可能少的數據,並儘可能將盡可能少的數據存儲在內存中。
你爲什麼記得取法? –
你有沒有試過'mysql_fetch_assoc'超出結果集的末尾......? – deceze