c'est ma première question en stackoverflow.Existe-t-il un meilleur moyen de regrouper les résultats de requête avec une boucle en PHP?
J'ai deux tables MYSQL: catégories et produits. Je gère les résultats de la requête avec une boucle while en PHP pour regrouper chaque catégorie avec ses produits. C'est la première fois que je fais quelque chose, et je pense que je l'ai fait très "astucieux/hardcoded" (désolé pour mon anglais). Je pense que cela devrait être une meilleure façon de le faire. Donc, je voudrais demander aux programmeurs professionnels. Voici mon code:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL auto_increment,
`name` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL auto_increment,
`name` text NOT NULL,
`description` text NOT NULL,
`category` int(11) NOT NULL,
`photo` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;
J'ai une requête qui retourne des produits relationed avec leur catégorie:
SELECT categories.name as category,products.name as product
FROM categories
INNER JOIN products ON(categories.id = products.category)
Avec PHP que je gère les résultats pour créer une liste non ordonnée pour chaque catégorie avec ses produits:
<?php
$category = '';//A control variable
while($row = mysql_fetch_array($query))
{
//if its a new category I start a new <ul>
if($row['category'] != $category)
{
//If it´s not the firt category I need to close previous one
if($category != '')
{
echo "</ul>\n";
}
//I start the new <ul>
echo '<h2>' . $row['category'] . '</h2>';
echo '<ul>';
}
//I create the correspondient <li>
echo '<li>' . $row['product'] . "</li>\n";
//Asign the value of actual category for the next time in the loop
$category = $row['category'];
}
//I neeed to close last <ul>
echo "</ul>\n";
?>
Y a-t-il une meilleure façon de faire cette opération? Merci d'avance pour vos réponses!
Vous pouvez faire une commande par le nom de la catégorie, à assurez-vous qu'ils sont tous ensemble. –
Merci pour le conseil. Je ne l'ai pas spécifié parce que sql renvoie les résultats commandés par categories.name. Si ce n'était pas le cas, je ne pourrais pas construire le ul comme je le veux. – FranQ
l'instruction telle quelle ne peut pas garantir qu'elle renvoie les choses commandées, si vous la laissez comme cela, vous pouvez trouver votre code inattendu plus tard lorsque sql renvoie une séquence différente où toutes les catégories ne sont pas regroupées. Mieux vaut ajouter l'ordre pour s'assurer qu'il n'y aura pas de problèmes plus tard. – mrjohn