1

自从大约 7 年前开发我的第一个 MySQL 项目以来,我一直在使用相同的一组简单函数来访问数据库(尽管最近将这些函数放入了 Database 类中)。

随着我开发的项目变得越来越复杂,数据库中的记录越来越多,因此出现内存问题的可能性也越来越大。

Allowed memory size of 67108864 bytes exhausted在遍历 MySQL 结果集时遇到 PHP 错误,想知道是否有更好的方法来实现我所拥有的灵活性而无需高内存使用。

我的功能如下所示:

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_*ormysqli_*函数,你应该返回资源,然后在你使用它的地方单步执行它,就像你单步执行它以填充数组一样。如果您使用PDO,那么您可以返回PDOStatement并使用PDOStatement::fetch()来逐步完成它。

于 2012-07-29T23:09:15.197 回答