如何在页面中多次获取相同的数据是最佳方式?

5

我希望在一个页面中展示从MySQL获取的数据,该数据被多次使用。

首先,我想使用while循环使用mysql_fetch_assoc()从MySQL获取数据,然后将其显示为菜单。第二次,我想在页脚中将相同的数据显示为站点地图。

目前,我正在两次调用mysql_fetch_assoc(),如下所示:

// This one is the Menu
echo '<ul class="menu">';
while( $data = mysql_fetch_assoc($query) ) { 
    echo '<li><a href="page.php?id='.$data['id'].'">'.$data['title'].'</a>';
}
echo '</ul>';

// other page contents here

// at the footer - the small sitemap
echo '<ul class="sitemap">';
while( $f_data = mysql_fetch_assoc($query) ) { 
    echo '<li><a href="page.php?id='.$f_data['id'].'">'.$f_data['title'].'</a>';
}
echo '</ul>';

我认为上面的代码可能比需要查询数据库两次使用更多的资源。由于我已经在页面中有了数据,再次获取相同的数据会浪费内存并且不好。所以我的问题是:
1.每次使用mysql_fetch_assoc()时,它是否发送单独的查询并从数据库中获取数据?还是只从数据库中获取一次数据,之后仅循环遍历现有的数组?
2.在我的情况下,最佳解决方案是什么?
简而言之-我是否以最佳方式执行此操作?是否有更好的方法来执行此操作,而不会浪费内存/资源/时间?因为我显示的是相同的数据。
7个回答

7

您最好的解决方案是将检索到的数据存储在数组中,然后您可以随时使用它而无需对数据库进行更多查询,示例如下:

// First we make the query and store the rows in an array
$result = mysql_query($query);
$data_array = array();
while ($data = mysql_fetch_assoc($result)) {
    $data_array[] = $data;
}

// Then we can loop through the values in that array without making further queries
echo '<ul class="menu">';
foreach ($data_array as $data) {
    echo '<li><a href="page.php?id=', $data['id'], '">', $data['title'], '</a>';
}
echo '</ul>';

// Another loop through our array
echo '<ul class="sitemap">';
foreach ($data_array as $f_data) {
    echo '<li><a href="page.php?id=', $f_data['id'], '">', $f_data['title'], '</a>';
}
echo '</ul>';

4

只是简单提一下它 :)

$menu = '<ul class="menu">';
while( $data = mysql_fetch_assoc($query) )
{ 
    $menu .= '<li><a href="page.php?id='.$data['id'].'">'.$data['title'].'</a>';
}
$menu .= '</ul>';

// header 
echo $menu;


// footer
echo $menu;

请注意,OP 希望在每个 <ul> 元素上放置不同的类。可以使用 2 个变量 $menu$sitemap 来启动列表,并将其内部(循环)称为 $list。然后只需 echo $menu . $list . "</ul>"; 即可轻松实现。 - Michael Berkowski
啊,好发现。我实际上只会创建一个div包装器。 <div id="menu"><ul>.... 和 <div id="sitemap"><ul>... 然后CSS可以是 #sitemap ul 和 #menu ul。 - AlienWebguy
这个可以工作,但我认为将数据存储到数组中是一个更好的想法,这样我就可以以更自定义的方式使用它们。 - Aajahid

3

1.不,它并不是这样的。 mysql_query用于查询数据库,而mysql_fetch_assoc用于过滤返回的结果集。

2.有一个更简单的解决方案:

$output = "";
while( $data = mysql_fetch_assoc($query) )
    $output .= "<li><a href='page.php?id={$data['id']}'>{$data['title']}</a></li>";

echo "<ul class='menu'>{$output}</ul>"; // This one is the Menu
// other page contents here
echo "<ul class='sitemap'>{$output}</ul>"; // at the footer - the small sitemap

如果没有,mysql_fetch_assoc 仍然会浪费资源吗? - Aajahid

3
将获取到的信息保存到一个数组中,然后循环遍历该数组,用于菜单和页脚。

2
为什么要反复查询同一数据?这是浪费资源的行为。只需将数据库数据保存到数组中,然后按照您喜欢和想要的方式输出即可。
请尝试以下方法:
  while( $data = mysql_fetch_assoc($query) )
    $menu[$data['id']] = $data['title'];

  // This one is the Menu
  echo '<ul class="menu">';

  foreach ($menu AS $id => $title)
    echo "<li><a href='page.php?id=$id'>$title</a></li>";

  echo '</ul>';

  // other page contents here

  // at the footer - the small sitemap
  echo '<ul class="sitemap">';

  foreach ($menu AS $id => $title)
    echo "<li><a href='page.php?id=$id'>$title</a></li>";

  echo '</ul>';

这就是为什么我要确认并知道更好的方法来做它的原因。 感谢您的回答。 - Aajahid

1

使用 mysql_data_seek($result, 0);

它将结果集的指针设置回开头。


0

使用mysqli_data_seek($result, 0)。

看起来更有效率,而且运行得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接