Champ avec 2 valeurs doit ressortir 2 lignes

Résolu
Signaler
Messages postés
19
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
2 août 2007
-
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013
-
Bonjour à tous :)


voila j'ai un petit casse tête a résoudre et je n'ai pas trouvé la solution...


J'ai une Table qui possède plusieurs champs dont un champ qui possède 2 valeurs.

Je m'explique:

champ1 / val1

champ2 / val2

champ3 / val3

jusque là pas de probleme MAIS j'ai ceci:

champ4 / val1, val2

champ5 / val2, val3


et là je voudrais que lorsque j'affiche mes lignes, que le champ4 et le champ5 ressortent 2 fois car ils ont 2 valeurs


Je classe ensuite mes résultats par valeur et je devrais avoir en sorti ceci:

champ1 / val1
champ4 / val1


champ2 / val2
champ4 / val2

champ5 / val2


champ3 / val3

champ5 / val3

comment puis je faire ca? j'utilise MySQL et PHP. donc si quelqu'un à une idée, je suis preneur car là je bloque...


MERCI A VOUS

7 réponses

Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

Ceci devrait fonctionner...


<?php

// classe pour permetre le tri

class champvaleurs{

    // variables

    var $nom_champ;

    var $valeur_champ;

    // constructeur

    function champvaleurs($champ,$valeur){

        $this->nom_champ = $champ;

        $this->valeur_champ = $valeur;

    }

}

// méthode permétant de comparer les deux objets... (comparaison avec les mêmes critères que strcmp...)

function compare($valeur1,$valeur2){

        $cmp = 0;    //
valeur de comparaison (-1 si la premiere chaine est la plus "petite", 0
si egales, 1 sinon)

        // les valeurs

        $cmp = strcmp($valeur1->valeur_champ,$valeur2->valeur_champ);

        // si les valeurs sont égales, on trie par noms...

        if($cmp==0){

            $cmp = strcmp($valeur1->nom_champ,$valeur2->nom_champ);

        }

        return $cmp;

}

// méthode de tri d'un tableau(tribulle)

function tribulle($tableau){

    $bon = 0;

    while($bon!=1){

        // on doit trier!!!

        $bon = 1;

        for($i=0;$i<sizeof($tableau)-1;$i++){

            // si l'élément du bas est plus petit que celui du dessus, on inverse

            if(compare($tableau[$i],$tableau[$i+1])==1){

                // on permute

                $tmp = $tableau[$i];

                $tableau[$i] = $tableau[$i+1];

                $tableau[$i+1] = $tmp;

                // on doit encor vérifier s'il faut trier...

                $bon = 0;

            }

        }

    }

    return $tableau;

}

// fonction d'affichage

function affiche($tableau){

    for($i=0;$i<sizeof($tableau);$i++){

        echo $tableau[$i]->nom_champ . " / " . $tableau[$i]->valeur_champ ."
";

    }

}

// connexion mysql:

$db_link = mysql_connect("localhost","root","");

mysql_select_db("test");

$requete = mysql_query("SELECT * FROM table_test",$db_link)or die(mysql_error());

// lecture des resultats

    // tableau de stockage

    $nbval = 0;    // nombre de valeurs à trier et afficher

for($i=0;$i<mysql_num_rows($requete);$i++){

    // on lit les valeurs

    $nom = mysql_result($requete,$i,'nom_champ');

    $valeurs = mysql_result($requete,$i,'valeur_champ');

    $valeurs = explode(",",$valeurs);    // on découpe les valeurs

    for($j=0;$j<sizeof($valeurs);$j++){

        $tableau[$nbval] = new
champvaleurs($nom,$valeurs[$j]);    // on crée les objets

        $nbval++;

    }

}

// on trie

    $tableau = tribulle($tableau);

// on affiche

    affiche($tableau);

// fin mysql:

mysql_close($db_link);

?>
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

donc si je comprends bien tu as une table mysql du type:

ma_table:

+--------------------+---------------------+

|     nom_du_champ   |   valeur_du_champ     |

+--------------------+---------------------+

|
champs1                 
|
val1                        
|

| champs2
                
| val2
                       
|

| champs3
                
| val3
                       
|

| champs4
                
|
val1                        
|

| champs4
                
| val2
                       
|

| champs5
                
| val3
                       
|

| champs5
                
| val4
                       
|

+--------------------+---------------------+

à ce stade là tu peux essayer ça:

<?php

$db_link = mysql_connect("serveur","user","pass");

mysql_select_db("mabase");

$requete = mysql_query("SELECT * FROM ma_table ORDER BY 'valeur_du_champ' ASC",$db_link)or die(mysql_error());

for($i=0;$i<mysql_num_rows($requete)){

    echo mysql_result($requete,$i,'nom_du_champ')." /
".mysql_result($requete,$i,'valeur_du_champ') ."
";

}

mysql_close($db_link);

?>


voilà

J'ai codé ça de tête donc c'est plus que probable que j'aie fait des erreurs et qu'on puisse améliorer ce truc...
Messages postés
19
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
2 août 2007

merci pour ta réponse :) mais ce n'est pas exactement ca... si ma table etait comme tu l'as écrite, je n'aurais pas de probleme...ma table se présente ainsi:

+--------------------+---------------------+
|     nom_du_champ   |   valeur_du_champ   |
+--------------------+---------------------+
| champs1                  | val1                         |
| champs2                  | val2                         |
| champs3                  | val3                         |
| champs4                  | val1, val2                 |
| champs5                  | val2, val3                 |
+--------------------+---------------------+

est ce que ca te parle plus ?
et je voudrais ressortir ca:
champ1 / val1
champ4 / val1
champ2 / val2
champ4 / val2
champ5 / val2
champ3 / val3
champ5 / val3

merci encore!!!!!
Messages postés
19
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
2 août 2007

alors la! je suis baba...ton code fonctionne a merveille et du 1er coup :)


il ne me reste plus qu'a l'adapter a ma tripoté de champs et je croise les doigts que ca fonctionne...


merci beaucoup pour ton aide et pour le temps que tu y as consacré
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

De rien, ce fut un plaisir de trouver quelque chose d'un peu
stimulant... en plus ca m'a permi d'apprendre la base des classes...
tout benef quoi!!!
Messages postés
19
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
2 août 2007

oki :) et bien dès que j'en ai un autre de bien tordu je te fais signe lol.


bon sinon apres plusieurs tests et petit craquage de cheveux j'ai réalisé qu'il fallait SUPPRIMER les ESPACES apres la virgule, sinon le trie etait faussé par moment...


donc encore merci et @+
Messages postés
354
Date d'inscription
dimanche 3 juin 2001
Statut
Membre
Dernière intervention
11 mars 2013

si l espace est nécessaire, tu peux essayer de remplacer "," par ", " dans explode...