2012-07-29 20 views
2

自從7年前開發我的第一個mySQL項目以來,我一直使用相同的一組簡單函數來訪問數據庫(儘管最近把這些放到了Database類中)。隨着我開發的項目變得越來越複雜,數據庫中的記錄越來越多,因此內存問題的可能性也越來越大。PHP'循環訪問MySQL結果集時允許內存大小爲67108864個字節'

在循環訪問mySQL結果集時,我收到了PHP錯誤Allowed memory size of 67108864 bytes exhausted,並想知道是否有更好的方法來實現我沒有高內存使用的靈活性。

我的功能看起來是這樣的:

function get_resultset($query) { 
    $resultset = array(); 

    if (!($result = mysql_unbuffered_query($query))) { 
     $men = mysql_errno(); 
     $mem = mysql_error(); 
     echo ('<h4>' . $query . ' ' . $men . ' ' . $mem . '</h4>'); 
     exit; 
    } else { 
     $xx = 0 ; 
     while ($row = mysql_fetch_array ($result)) { 
      $resultset[$xx] = $row; 
      $xx++ ; 
     } 
     mysql_free_result($result); 
     return $resultset; 
    } 
} 

然後我就可以編寫一個查詢,並使用該函數來獲取所有的結果,例如:

$query = 'SELECT * FROM `members`'; 
$resultset = get_resultset($query); 

我可以再通過$resultset和顯示環結果,例如:

$total_results = count($resultset); 

for($i=0;$i<$total_results;$i++) { 
    $record = $resultset[$i]; 

    $firstname = $record['firstname']; 
    $lastname = $record['lastname']; 

    // etc, etc display in a table, or whatever 
} 

有沒有更好的循環途徑gh的結果,同時仍然可以訪問每個記錄的屬性來顯示結果列表?我一直在尋找有類似問題的人,所給出的答案似乎不適合我的情況或者有點模糊。任何幫助將不勝感激。

+0

你可能想看看內置的PHP PDO類:http://php.net/manual/en/book.pdo.php – seavers 2012-07-29 23:10:47

+0

你應該考慮使用[PDO](http://php.net/ pdo),因爲'mysql_ *'函數已經被棄用了很長一段時間,並且它們很可能在不久的將來消失。 – rid 2012-07-29 23:11:45

回答

5

你的問題是你正在創建一個數組,並用全部填充結果集中的結果,然後從函數返回這個巨大的數組。我想這個功能不支持任何mysql_*函數的原因是它效率極低。

你不應該填滿你得到的所有東西。你應該逐步完成結果,就像填充數組一樣,但不是填充任何東西,而是應該處理結果並進入下一個結果,以便爲這個結果釋放內存。

如果您使用mysql_*mysqli_*函數,您應該返回資源,然後在您使用該資源的地方單步執行,就像您逐步完成填充陣列一樣。如果您使用PDO,那麼您可以返回PDOStatement並使用PDOStatement::fetch()來逐步完成。

+0

感謝您向我推薦PDO;我沒有意識到這一點。你知道任何爲從mysql_ *函數遷移到PDO的人員提供幫助的資源嗎? – OnTheFly 2012-07-29 23:12:49

+0

@ user539484,對不起,我沒有,但是PDO非常好用。我建議你看看[文檔](http://www.php.net/manual/en/book.pdo.php)(['PDO :: prepare()'](http ://www.php.net/manual/en/pdo.prepare.php)頁面非常有用)或找到任何關於它的教程。切換到PDO應該可以讓你免除許多你自己必須做的工作,例如逃避,同時也提供OOP API。 – rid 2012-07-29 23:17:18

+0

謝謝你。我在http://phpmaster.com/migrate-from-the-mysql-extension-to-pdo/上找到了一個教程,並認爲我會在此分享給那些可能會遇到我的問題的人。 – OnTheFly 2012-07-29 23:41:26

相關問題