【问题标题】:Nested loops always confuse me嵌套循环总是让我感到困惑
【发布时间】:2010-02-15 19:29:32
【问题描述】:

所以我有一个循环嵌套在基于两个查询的另一个循环中。我的第一个循环运行良好-

$sql_categories = mysql_query("SELECT * FROM $categories_table");

$results = mysql_query("SELECT * FROM $events_table");
    while ($num_rows = mysql_fetch_assoc($sql_categories)) {
        extract($num_rows);
        echo "<h2>$category_name</h2>";
        // Begin second loop to output events
        while/for(not sure) {

    }
}

我想将对应$category_id 的所有$vars 输出到第二个循环中。在第二个查询中,匹配值为$event_category_id

我不知道这是否有意义,但我想要得到的基本上是--

<h2>Category One</h2>
Event Name
Event Name
Event Name

<h2>Category Two</h2>
Event Name
Event Name
Event Name

等等。其中“事件名称”对应于“类别名称”

我正在使用的两个表看起来像这样-

CREATE TABLE `wp_wild_dbem_categories` (
  `category_id` int(11) NOT NULL auto_increment,
  `category_name` tinytext NOT NULL,
  PRIMARY KEY  (`category_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

CREATE TABLE `wp_wild_dbem_events` (
  `event_id` mediumint(9) NOT NULL auto_increment,
  `event_author` mediumint(9) default NULL,
  `event_name` tinytext NOT NULL,
  `event_start_time` time NOT NULL default '00:00:00',
  `event_end_time` time NOT NULL default '00:00:00',
  `event_start_date` date NOT NULL default '0000-00-00',
  `event_end_date` date default NULL,
  `event_notes` text,
  `event_rsvp` tinyint(1) NOT NULL default '0',
  `event_seats` tinyint(4) default NULL,
  `event_contactperson_id` mediumint(9) default NULL,
  `location_id` mediumint(9) NOT NULL default '0',
  `recurrence_id` mediumint(9) default NULL,
  `event_category_id` int(11) default NULL,
  UNIQUE KEY `event_id` (`event_id`)
) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=latin1

感谢您的帮助!

【问题讨论】:

    标签: php loops for-loop while-loop


    【解决方案1】:

    您需要在 while 循环内进行第二个查询 以使其产生任何有意义的效果:

    $sql_categories = mysql_query("SELECT * FROM $categories_table");
    
    while($category = mysql_fetch_assoc($sql_categories)) {    
        extract($category);    
        $events = mysql_query("SELECT * FROM $events_table WHERE event_category_id = '".mysql_real_escape_string($category_id)."'");
    
        echo "<h2>$category_name</h2>";    
        while($event = mysql_fetch_assoc($events) {
            extract($category);
            echo "<p>$event_name</p>";
        }
    }
    

    这应该可以让你到达你想要的地方,但请注意,这不是做事的最佳方式。您应该首先获取所有事件,构建一个由 event_category_id 索引的数组,然后在您的 while 循环中循环该数组。这是因为现在您要为每个类别执行一个额外的查询,而总共只需要两个查询就足够了。

    但也许这会让你开始这样做。

    【讨论】:

    • 这工作得很好,你是对的,它对数据库的点击次数并不是最佳的,但对我来说,在我的骇客 PHP 中,它可以工作。一旦页面执行我想要的操作,我将按照您的建议进行改进。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2023-03-16
    • 2020-10-05
    • 2011-09-08
    • 2018-10-03
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多