自从大约7年前开发我的第一个MySQL项目以来,我一直在使用相同的一组简单函数来访问数据库(尽管最近我把这些函数放进了数据库类中)。
随着我开发的项目变得越来越复杂,数据库中的记录越来越多,因此内存问题的可能性也越来越大。
当我循环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
}
有没有一种更好的方法可以在结果中循环,同时仍然可以访问每个记录的属性以显示结果列表?
我一直在寻找有类似问题的人,但给出的答案似乎不适合我的情况,或者有点模糊。
您的问题是创建一个数组,并用结果集中的所有结果填充它,然后从函数返回这个巨大的数组。我想,任何mysql_*
函数都不支持这一点的原因是它的效率非常低。
你不应该用你得到的所有东西填满数组。您应该逐步查看结果,就像填充数组时一样,但不应该填充任何内容,而是应该处理结果并进入下一个结果,这样这个结果的内存就有机会被释放。
如果使用mysql_*
或mysqli_*
函数,则应返回资源,然后在使用它的地方遍历它,就像遍历它来填充数组一样。如果您使用PDO,那么您可以返回PDOStatement
并使用PDOStatement::fetch()
逐步通过它。