【问题标题】:What is the best way to fetch same data multiple times in a page?在一个页面中多次获取相同数据的最佳方法是什么?
【发布时间】:2011-07-08 23:24:37
【问题描述】:

我想在从 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. 就我而言,最好的解决方案是什么?

简单地说 - 我是否以最好的方式做到这一点?有没有更好的方法来做到这一点,而不是浪费内存/资源/时间?因为它是相同的数据,所以我显示了两次。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

    // 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>';
    

    【讨论】:

      【解决方案2】:

      只是参考它:)

      $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 希望在每个 &lt;ul&gt; 元素上放置一个不同的类。在这里使用 2 个变量 $menu$sitemap 来启动列表很容易实现,并将其内部(循环)称为 $list。然后只需echo $menu . $list . "&lt;/ul&gt;";
      • 啊,很好。我实际上只是制作一个 div 包装器。
      • 这个可以,但我认为将数据存储到数组中是一个更好的主意,所以我可以以更自定义的方式使用它们。
      【解决方案3】:

      将获取的信息保存到一个数组中,然后在这个数组中循环访问菜单和页脚。

      【讨论】:

        【解决方案4】:

        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还会浪费资源吗?
        【解决方案5】:

        为什么要对相同的数据进行多次数据库调用?那是资源的浪费。只需将 db 数据保存到数组中,然后将其输出到您喜欢的任何位置即可。

        试试这个:

          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>';
        

        【讨论】:

        • 这就是为什么我要求确定并知道更好的方法。感谢您的回答。
        【解决方案6】:

        使用mysql_data_seek($result, 0);

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

        【讨论】:

          【解决方案7】:

          使用 mysqli_data_seek($result, 0)。

          看起来效率更高,工作起来就像一个魅力

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多
            热门标签