1

約7年前に最初のMySQLプロジェクトを開発して以来、データベースにアクセスするために同じ一連の単純な関数を使用してきました(ただし、最近、これらをDatabaseクラスに入れました)。

私が開発するプロジェクトがより複雑になるにつれて、データベースにはより多くのレコードがあり、その結果、メモリの問題が発生する可能性が高くなります。

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
}

結果リストを表示するために各レコードのプロパティにアクセスしながら、結果をループするより良い方法はありますか?

私は似たような問題を抱えている人々を探し回っていますが、与えられた答えは私の状況に合わないか、少し曖昧です。

4

1 に答える 1

5

問題は、配列を作成し、結果セット内のすべての結果で埋めてから、この巨大な配列を関数から返すことです。これがどのmysql_*関数でもサポートされていない理由は、非常に非効率的であるためだと思います。

取得したすべてのものでアレイをいっぱいにしないでください。配列を埋めるときと同じように結果をステップスルーする必要がありますが、何かを埋める代わりに、結果を処理して次の結果に移動し、この結果のメモリが解放される機会を得る必要があります。

mysql_*または関数を使用する場合はmysqli_*、リソースを返し、使用している場所でリソースをステップスルーする必要があります。これは、配列を埋めるためにステップスルーするのと同じ方法です。PDOを使用している場合は、を返し、PDOStatementを使用PDOStatement::fetch()してステップスルーできます。

于 2012-07-29T23:09:15.197 に答える