Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 17h31   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Résultat d'une requête dans un tableau un peu compliqué

Bonjour à tous,

Soit une table MySQL composée d'une colonne "cat_id" et d'une colonne "prod_id". Classique.

Code :
1
2
3
4
5
6
7
8
9
 
cat_id | prod_id
1             12
1             10
1             20
2             5
2             7
3             1
etc...
Chaque produit étant rangé dans une catégorie.
Mais je voudrais y ajouter une 3ème colonne : poids.
De façon à faire monter ou descendre les produits dans leur catégorie.
Et pour garnir cette colonne pour la première fois, j'ai besoin de faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
cat_id | prod_id | poids
1             12          1
1             10          2
1             20          3
2             5            1
2             7            2
3             1            1
4             6            1
4             9            2
etc...
Bref que le poids commence à 1 à chaque nouvelle catégorie rencontrée.
Et je tourne le truc dans tous les sens, avec des tableaux, des sessions...pour préparer la requête UPDATE de la colonne poids... pas moyen...
Quelle technique utiliseriez-vous ?
D'avance merci.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 18h32   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Salut

En 1er, pourquoi cette appellation "poids", alors que il s’agirait plutôt de : trie, ordre, classement ?
Bon, peu importe, il ne s'agirait toute de même pas de Kg de tomate

A mon sens, je verrais plutôt un trie d'abord dans la table "categories", puis après dans la table produits, plutôt que cette table qui rassemble des produits et catégories, qui n'est pas sont rôle je pense.

En somme, créer un champ "ordre" dans la table "categories" et champ "ordre" dans "produits".
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/03/2011, 18h42   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour,

Bah...poids, c'est assez fréquemment employé lorsqu'il s'agit de faire "monter" ou "descendre" des articles, par exemple, sur une page...

Ben si c'est son rôle, justement : elle associe les id de la table produits et les id de la table catégories, et ensuite, avec une jointure on récupère ce que l'on veut.

J'ai trouvé une soluce, finalement, qui a l'air de fonctionner :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
$sql = mysql_query("select prod_id , cat_id as from produits_categories order by cat_id");
$tab_cat = array();
while($row = mysql_fetch_assoc($sql)){
	$tab_cat[$row['cat_id']][] = $row['prod_id'];
}
 
foreach($tab_cat as $id=>$array_cat){
	$i =1;
	foreach($array_cat as $id_cat=>$id_prod){
 
		$sql = "UPDATE produits_categories SET poids = '".$i."' 
		WHERE prod_id = '".$id_prod."' and cat_id='".$id."'";
		mysql_query($sql) or die(mysql_error());
		$i++;
	}	
}
doit y avoir plus simple...mais bon !
Pourquoi faire simple quand on peut faire compliqué ?

Merci d'être passé par là.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 20h16   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
Ben si c'est son rôle, justement : elle associe les id de la table produits et les id de la table catégories, et ensuite, avec une jointure on récupère ce que l'on veut.
En est tu vraiment certain ?
Essai de faire un trie par catégorie pour voir.

On ne récupère pas ce qu'on veut, on ne fait que récupérer des produits qui seront certes triés selon leur catégorie, mais on obtient pas pour autant un trie indépendamment des valeurs des IDs des catégories.
Modifier les valeurs des clés des IDs des catégories ne sera certainement pas à faire.

Pour ce faire, et en poursuivant ton idée, ce serait de rajouter un champ "poids_cat" dans cette même table.
Et c'est là qu'on verra apparaitre un phénomène de répétition qui ne fera pas l'ombre d'un doute qu'il y a quelque chose qui cloche en mettant ces informations de trie dans cette table prod_cat.


Maintenant, si cela te conviens ainsi, t'en mieux.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/03/2011, 00h10   #5
Membre actif
 
Inscription : février 2009
Messages : 150
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 150
Points : 198
Points : 198
Il faudra forcement une requete par produit si tous sont à changer lors d'une seule execution.
Je comprend mal pourquoi la table doit etre aussi bien ranger,
les chiffres du poids peuvent ils ressembler à 500 1000 2733 ?? qui correspondrait à 1 2 3 et donc le 1er 2eme 3eme produit de la catégorie 1.
La liste de produits est elle longue ?
nextdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 07h11   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
les chiffres du poids peuvent ils ressembler à 500 1000 2733 ?? qui correspondrait à 1 2 3 et donc le 1er 2eme 3eme produit de la catégorie 1.
Ceci relève de l'astuce, qui à mon sens peut difficilement être fait de manière automatique.
Si par exemple il y a déjà 454, 455 et 456 et qu'on souhaite intercaler un produit, on retombe dans le même problème.


Pour faire un système de remontée totalement automatique et de manière assez conviviale (ou ergonomique) tout en conservant un ordre sans trou (comme 1,2,3,4 etc) c'est c'est assez simple.
On a donc un ordre comme ceci :
1
2
3 <- On veut le faire remonter (donc à 4)
4
5

Il suffit d'ajouter 1 au produit concerné (4) et enlever 1 au produit suivant (changer à 3).
Si on veut faire l'opération inverse, soit descendre : on enlève 1 au produit concerné, et on ajoute 1 au produit précédent.
En faite, le truc est d'intervertir l'ordre de 2 produits.

Certes, ce principe ne permet pas de faire remonter d'un coup de la position 2 à 5 par exemple, il faudra appliquer le mise à jour 3 fois pour faire remonter le produit petit à petit, mais l'avantage c'est qu'il reste simple à gérer.


Cependant, il y a des moments où on ne va plus avoir cet ordre, c'est lorsque qu'un produit sera supprimé, ou lorsqu'un produit sera déplacé dans une autre catégorie.
Il va avoir un trou entre 2 produits.
Mais rien d'insurmontable, il suffit de récupérer tous les produits de la catégorie où un produit a été supprimé, de stocker les IDs des produits dans un tableau Php selon l'ordre en court, puis après, appliquer en boucle un UPDATE en utilisant la clé du tableau Php.
En va ré-obtenir un ordre : 0, 1, 2, 3, etc ...
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/03/2011, 07h54   #7
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Citation:
Pour faire un système de remontée totalement automatique et de manière assez conviviale (ou ergonomique) tout en conservant un ordre sans trou (comme 1,2,3,4 etc) c'est c'est assez simple.
On a donc un ordre comme ceci :
1
2
3 <- On veut le faire remonter (donc à 4)
4
5

Il suffit d'ajouter 1 au produit concerné (4) et enlever 1 au produit suivant (changer à 3).
Si on veut faire l'opération inverse, soit descendre : on enlève 1 au produit concerné, et on ajoute 1 au produit précédent.
En faite, le truc est d'intervertir l'ordre de 2 produits.
C'est exactement comme cela que je fonctionne.
Et si on ajoute un produit, et bien, dans le formulaire de créa, j'affiche une liste déroulante avec :début + poids + fin et je demande au user où est-ce qu'il veut intercaler le produit. Si il enlève un produit, pas de problème, je le supprime de la table. Le fait qu'il y ait des "trous" dans les poids n'est pas gênant tant que la requête d'affichage fait un ORDER BY poids.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 06h28   #8
Membre actif
 
Inscription : février 2009
Messages : 150
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 150
Points : 198
Points : 198
Oui donc le script présenté ici n'est pas celui dont tu te sers pour refaire l'ordre à chaque changement...
Et donc tu utilise deja un du bon script pour traiter tes rangements.
nextdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h56.


 
 
 
 
Partenaires

Hébergement Web