2010-03-26 4 views
0

Je construis un menu de navigation qui répertorie toutes mes catégories et sous-catégories. Le problème est qu'il renvoie seulement un de ceux-ci et pas tous. Je les catégories résonnaient dans la boucle while donc je ne sais pas pourquoi il est seulement montrant un résultat et non pas tous:Quel est le problème avec mon code PHP/MySQL?

<?php 

$query = mysql_query("SELECT * FROM categories_parent"); 

while ($row = mysql_fetch_assoc($query)) { 

    $id = $row['id']; 
    $name = $row['name']; 
    $slug = $row['slug']; 
    $childStatus = $row['child_status']; 

    // if has child categories 
    if ($childStatus == "1") { 
     echo "<li class='dir'><a href='category.php?slug=$slug'>$name</a>"; 
     echo "<ul id='dropdown'>"; 

      $query = mysql_query("SELECT * FROM categories_child WHERE parent=$id"); 
      while ($row = mysql_fetch_assoc($query)) { 
       $id = $row['id']; 
       $name = $row['name']; 
       $slug = $row['slug']; 

       echo "<li><a href='category.php?slug=$slug'>$name</a></li>"; 
      } 

     echo "</ul>"; 
     echo "</li>"; 
    } 
    // if singular parent 
    else { 
     echo "<li><a href='category.php?slug=$slug'>$name</a></li>"; 
    } 

} 

?> 

Mes tables de base de données:

-- 
-- Table structure for table `categories_child` 
-- 

CREATE TABLE IF NOT EXISTS `categories_child` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(1000) NOT NULL, 
    `slug` varchar(1000) NOT NULL, 
    `parent` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=139 ; 

-- 
-- Dumping data for table `categories_child` 
-- 

INSERT INTO `categories_child` (`id`, `name`, `slug`, `parent`) VALUES 
(138, 'Britney Spears', 'category/celiberties/britney-spears/', 137), 
(136, 'Tigers', 'category/animals/tigers/', 136), 
(137, 'Horses', 'category/animals/horses/', 136), 
(135, 'Lions', 'category/animals/lions/', 136); 

-- 
-- Table structure for table `categories_parent` 
-- 

CREATE TABLE IF NOT EXISTS `categories_parent` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(1000) NOT NULL, 
    `slug` varchar(1000) NOT NULL, 
    `child_status` int(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=139 ; 

-- 
-- Dumping data for table `categories_parent` 
-- 

INSERT INTO `categories_parent` (`id`, `name`, `slug`, `child_status`) VALUES 
(137, 'Celiberties', 'category/celiberties/', 1), 
(138, 'TV Shows', 'category/tv-shows/', 0), 
(136, 'Animals', 'category/animals/', 1); 
+1

Retourne un seul élément Une des catégories parentes, ou l'une des catégories enfant? – John

+1

Vous pouvez mettre tout cela dans une table de base de données. Vous avez essentiellement deux fois la même table. –

Répondre

3

C'est parce que vous redéclarant votre $query et $row dans votre instruction while. Par conséquent, votre instruction while intégrée se terminera et votre instruction while while essaiera d'extraire une autre requête de votre ligne $query redéclarée et retournera false car elles ont toutes été exécutées depuis la nouvelle. Votre ancien n'existe plus parce que vous l'avez écrasé. Vous devez utiliser différents noms de variables pour votre boucle while interne, par exemple $query2 et $row2.

+0

Erreur stupide, merci. J'avais peur que ce soit un problème beaucoup plus complexe. – James

+0

Cela ne devrait pas poser de problème pour surcharger '$ row' ... –