2010-02-15 10 views
0

J'ai donc une boucle à imbriquer dans une autre boucle basée sur deux requêtes. J'ai la première boucle de travail fineLes boucles imbriquées me confondent toujours

Je veux sortie dans la deuxième boucle tous les $vars pour la $category_id correspondante. Dans la deuxième requête, la valeur correspondante est $event_category_id.

Je ne sais pas si cela fait sens, mais ce que je suis en train de faire est basically--

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

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

etc., où le « Nom de l'événement » correspond au « Nom de la catégorie »

Les deux tableaux avec lesquels je travaille ressemblent à this-

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 

Merci pour votre aide!

Répondre

5

Vous devez faire la deuxième requête dans la boucle while pour qu'elle ait un effet significatif:

$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>"; 
    } 
} 

Cela devrait vous rendre où vous voulez, mais notez que ce n'est pas la meilleure façon de faire des choses. Vous devriez d'abord obtenir tous les événements, en construire un tableau indexé par event_category_id et boucler ce tableau dans votre boucle while. C'est parce que maintenant vous faites une requête supplémentaire pour chaque catégorie alors que seulement deux requêtes au total devraient suffire.

Mais peut-être que cela vous aiderait à démarrer alors.

+1

Cela a fonctionné parfaitement et vous avez raison, ce n'est pas optimal avec le nombre de hits à la DB, mais pour moi dans mon PHP hackerish, ça marche. Je vais essayer de l'améliorer comme vous le suggérez une fois que la page fait ce que je veux qu'elle fasse. Merci! – Marty