在php中显示多个mysql行的最佳方法是什么?(获取然后显示或获取全部然后显示)


Which is the best approach for displaying multiple mysql rows in php? (fetch then display or fetch ALL then display)

如问题所述。

我实现了一个函数,其中它从数据库中获取多行(*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中进行测试以查看差异。