IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Résultat d'une requête dans un tableau un peu compliqué [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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".

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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à.

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 149
    Par défaut
    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 ?

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    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 ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] récupérer le résultat d'une requête dans un tableau
    Par faty2 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/05/2007, 16h22
  2. Réponses: 2
    Dernier message: 27/03/2007, 01h19
  3. [MySQL] Résultat d'une requête dans un tableau
    Par olivier94 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 22/03/2007, 21h03
  4. [MySQL] Afficher le résultat d'une requête dans un tableau
    Par magobouli dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/02/2007, 14h41
  5. Réponses: 12
    Dernier message: 09/01/2007, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo