2012-07-29 2 views
2

약 7 년 전에 나의 첫 번째 mySQL 프로젝트를 개발 한 이래로 데이터베이스에 액세스하기 위해 동일한 간단한 함수 세트를 사용 해왔다. 최근 이것들을 Database 클래스에 넣는다). 내가 개발 한 프로젝트가 복잡 해짐에 따라 데이터베이스에 더 많은 레코드가 생겨 결과적으로 메모리 문제가 발생할 가능성이 커졌습니다.PHP MySQL 결과 세트를 반복 할 때 '허용 메모리 크기 67108864 bytes exhausted'

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 
} 

더 좋은 루핑 방법이 있습니까? 결과 목록을 표시하기 위해 각 레코드의 속성에 계속 액세스 할 수 있습니까? 나는 비슷한 문제가있는 사람들을 찾고 있었고 주어진 답은 제 상황에 어울리는 것 같지 않거나 다소 모호합니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

php PDO 클래스를 살펴볼 수 있습니다. http://php.net/manual/en/book.pdo.php – seavers

+0

[PDO] (http://php.net/)를 사용해보십시오. pdo) mysql_ * 함수는 꽤 오래 동안 사용되지 않았으므로 가까운 장래에 사라질 것입니다. – rid

답변

5

귀하의 문제는 당신이 그 기능에서이 거대한 배열을 반환, 배열을 생성하고 모든하여 결과 집합의 결과를 채우고있는 것입니다. 나는 이것이 어떤 mysql_* 함수에 의해서도 지원되지 않는 이유는 매우 비효율적이라고 생각한다.

배열을 모두 채우지 않아야합니다. 배열을 채울 때와 마찬가지로 결과를 단계별로 처리해야하지만, 무엇이든 작성하는 대신 결과를 처리하고 다음 결과로 이동해야하므로이 메모리가 해제 될 수 있습니다.

mysql_* 또는 mysqli_* 함수를 사용하는 경우 리소스를 반환 한 다음 배열을 채우는 것과 같은 방법으로 사용중인 곳으로 바로 이동해야합니다. PDO을 사용하는 경우 PDOStatement을 반환하고 PDOStatement::fetch()을 사용하여 단계별로 검토 할 수 있습니다.

+0

저를 PDO에 소개해 주셔서 감사합니다. 나는 그 사실을 몰랐다. mysql_ * 함수에서 PDO로 마이그레이션하는 사람들을위한 도움말을 제공하는 리소스를 알고 있습니까? – OnTheFly

+0

@ user539484, 죄송 합니다만, PDO는 사용하기가 쉽습니다. [Documentation] (http://www.php.net/manual/en/book.pdo.php) (['PDO :: prepare()'] (http : //www.php.net/manual/en/pdo.prepare.php) 페이지는 아주 유용합니다.) 또는 그것에 관한 튜토리얼을 찾으십시오. PDO로 전환하면 OOP API를 제공하면서 예를 들어 탈출하는 등 자신이해야 할 많은 작업을 줄일 수 있습니다. – rid

+0

고마워요. 나는 http://phpmaster.com/migrate-from-the-mysql-extension-to-pdo/에서 튜토리얼을 발견했고, 내 질문에 우연히 만날 수있는 다른 사람들을 위해 그것을 공유 할 것이라고 생각했다. – OnTheFly