如问题所述。
我实现了一个函数,其中它从数据库中获取多行(*1),然后(*2)将每行实例化为对象。实例化后,对象被存储到一个数组中,然后将结果返回给调用者函数,然后遍历结果数组,显示每个对象并为每个对象添加html格式。
以下是代码片段:
function find_all() {
//(*1) Fetch 30 comments from DB
$sql = 'SELECT * FROM comments';
$sql .= ' ORDER BY datetime DESC LIMIT 30';
return find_by_sql($sql);
}
function find_by_sql($sql='') {
global $database;
$result_set = $database->query($sql);
$object_array = array();
while($row = $database->fetch_array($result_set)) {
//(*2) Instantiate each row to a Comment object
// and then stores each comment to an object array
$object_array[] = Comment::instantiate($row);
}
return $object_array;
}
//(*3) Format and display each result.
$comments = find_all();
foreach ( $comments as $comment ) {
// Not sure if syntax is correct.. anyhow..
echo "<li>$comment->get_text()</li>";
}
然而,我喜欢上面的方法,因为它更干净、更易于阅读、可维护,而且更面向对象。但问题是,它需要更长的时间来显示,而不仅仅是简单地迭代每个结果,而不是在提取后显示每个结果,就像这样:
while ($row = mysql_fetch_array($sql)) {
echo "<li>$row['text']</li>";
}
我知道它慢的原因。我想知道的是,有没有更好的方法来解决上面的问题?
虽然缓存可能是个好主意,但它不会有帮助,因为每次获取列表时我都需要一个更新的列表。
我认为如果脚本只获取您对结果集感兴趣的部分,速度会更快一些,因为fetch_array()返回两个具有相同结果集的数组:associative和numeric。
通过添加MYSQLI_ASSOC(如果使用MYSQLI):MYSQLI_fetch_array($result,MYSQLI_ASSOC),或尝试使用mysql_fetch_ASSOC(),脚本只接收关联数组。您可以在pmpMyAdmin中进行测试以查看差异。