Aller au contenu

Grouper des enregistrements


Sujets conseillés

Posté

Bonjour à tous,

J'essaie de grouper des enregistrements sur une carte.

Bon pour commencer voici le code de cette page

<?php
//appel du haut de la page

$titre = "Liste des espèces par commune";
include 'haut.php';
require ("connection.inc.php");

// LISTE DES ESPECES

$sql = 'SELECT DISTINCT communes.idcommune, communes.commune, especes.idespece, especes.nomespece, jonction.date, jonction.recolteur, jonction.identificateur FROM communes, especes, jonction WHERE jonction.idcommune = communes.idcommune AND especes.idespece = jonction.idespece ORDER BY communes.commune ASC';

// on envoie la requete

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

echo '<h3>'.$data['commune'].'</h3> ';
// on fait une boucle qui va faire un tour pour chaque enregistrement

while($data = mysql_fetch_assoc($req))
{
echo '<h3>'.$data['commune'].'</h3> <strong>'.$data['nomespece'].'</strong> <i>Récolteur:</i> '.$data['recolteur'].' <i>Identificateur:</i> '.$data['identificateur'].' <i>Date:</i> '.$data['date'].'<br/ >';
}
//fin de la boucle

//on ferme la connexion à la base
mysql_close();

//appel du haut de la page
include 'bas.php';
?>

Comme vous pouvez le remarquer les communes se répétent autant de fois qu'il y a d'espèce enregistrée dedans. J'aimerai que ces espèces soient réunies pour donner quelque chose du genre:

Commune 1

espèce1

espèce2

espèce3

Commune2

espèce1

espèce2

espèce3

J'ai vu le "group by" mais il faut un calcul apparemment et je n'ai pas de nombre pour effectuer un quelconque calcul dans ma base.

Comment puis-je procéder?

Merci d'avance ;)

Posté (modifié)

Bonjour,

Si j'ai bien compris, tu souhaiterais eviter d'avoir quelquechose comme :

Commune 1 espèce1

Commune 1 espèce2

Commune 1 espèce3

Commune 2 espèce1

Commune 2 espèce2

Commune 2 espèce3

Pour ca j'ai ma propre technique ^^ j'utilise une variable $prec dans la boucle, dont la valeur serait ici le nom de la commune de la ligne précédente.

Si c'est le meme que la ligne courante, alors je ne reecris pas le nom de la commune.

Si c'en est un différent, je l'écris.

Il faut aussi penser a bien initialiser la variable avant la boucle.

Et le tour est joué.

regarde ce topic ou j'ai deja repondu la meme chose ;)

Le cas est tres similaire il me semble.

Ou alors n'aurai je rien compris? et mon post ne servirait donc a rien....

PS: pour les grosses parties de code, utilise plutot la codebox. ca marche mieux :D

Modifié par Nanane
Posté (modifié)

Merci pour la réponse ;)

J'ai essayé, ça me donne une erreur: http://belgant.winetux.be/carte/espcommunecomplet2.php

le code:

<?php
//appel du haut de la page

$titre = "Liste des espèces par commune";
include 'haut.php';
require ("connection.inc.php");










// LISTE DES ESPECES


$sql = 'SELECT DISTINCT communes.idcommune, communes.commune, especes.idespece, especes.nomespece, jonction.date, jonction.recolteur, jonction.identificateur FROM communes, especes, jonction WHERE jonction.idcommune = communes.idcommune AND especes.idespece = jonction.idespece ORDER BY communes.commune ASC' ;

// on envoie la requete

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


// on fait une boucle qui va faire un tour pour chaque enregistrement





$prec = " ";
while ($row = mysql_fetch_assoc($req))
{

if( $row["commune"] = $prec )
{
if (prec==" ")
{$tab.= "<tr>";}
else
{$tab.="</td></tr><tr>";}

$tab .= "<td>".$row["commune"]."</td><td>".$row["nomespece"];
}
else
{
$tab .= $row["nomespece"];
}
$prec=$commune;
}







//on ferme la connexion à la base
mysql_close();

//appel du haut de la page
include 'bas.php';

?>

Là je suis totalement perdu, tu ne saurais pas me refaire un exemple mais sans les td et autre joyeusetés du genre?

Merci d'avance ;)

Modifié par Barbarus
Posté

Bonjour,

Attention sur cette ligne :

if( $row["commune"] = $prec )

Il manque un '='

if( $row["commune"] == $prec )
Posté

J'ai remarqué 2-3 erreurs dans ton code, notamment :

= au lieu de == dans le test if($row["commune"] = $prec)

faire if($prec == "") apres if($row["commune"] == $prec) implique que $row["commune"] = "" et n'a aucun sens ;)

Comme toujours dans les boucles et les if, je trouve qu'il faut d'abord commencer par decomposer les différents cas et situations qui peuvent se présenter et comment y réagir.

1- premiere ligne = "<h3>nom de commune</h3>"

2- lignes suivantes :

cas 1 : nom de commune egal au precedent => ligne = "nom d'espece<br/>"

cas 2 : nom de commune différent => ligne = "<br/><h3>nouvelle commune</h3>"

Il te suffit de traduire ce cours paragraphe en "if" et le tour est joué.

ca doit te donner une imbrication comme celle ci :

if ($prec =="")
{
/* premiere ligne */
}
else
{
/* lignes suivantes */
if($commune == $prec)
{
/* commune egale a la precedente */
}
else
{
/* commune differente de la precedente */
}
}

Et normalement ca fonctionne :D

Posté

Salut,

J'ai modifié le code:

$sql = 'SELECT DISTINCT communes.idcommune, communes.commune, especes.idespece, especes.nomespece, jonction.date, jonction.recolteur, jonction.identificateur FROM communes, especes, jonction WHERE jonction.idcommune = communes.idcommune AND especes.idespece = jonction.idespece ORDER BY communes.commune ASC' ;

// on envoie la requete

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


// on fait une boucle qui va faire un tour pour chaque enregistrement

$prec = " ";
while ($row = mysql_fetch_assoc($req))
{

if ($prec ==" ")
{
/* premiere ligne */
echo '<h3>1'.$row['commune'].'</h3> <strong>'.$row['nomespece'].'</strong> <i>Récolteur:</i> '.$row['recolteur'].' <i>Identificateur:</i> '.$row['identificateur'].' <i>Date:</i> '.$row['date'].'<br/ >';
}
else
{
/* lignes suivantes */

if($commune == $prec)
{
/* commune egale a la precedente */
echo '<strong>'.$row['nomespece'].'</strong> <i>Récolteur:</i> '.$row['recolteur'].' <i>Identificateur:</i> '.$row['identificateur'].' <i>Date:</i> '.$row['date'].'<br/ >';
}
else
{
/* commune differente de la precedente */
echo '<h3>3'.$row['commune'].'</h3> <strong>'.$row['nomespece'].'</strong> <i>Récolteur:</i> '.$row['recolteur'].' <i>Identificateur:</i> '.$row['identificateur'].' <i>Date:</i> '.$row['date'].'<br/ >';
}
}
$prec = $commune ;

}




//fin de la boucle

//on ferme la connexion à la base
mysql_close();

J'ai mis un 1 et un 3 pour pouvoir me repérer à l'affichage :lol: (ben ouais faut bien trouver des magouilles pour les essais)

Bon voilà ce que ça donne: http://belgant.winetux.be/carte/espcommunecomplet2.php

On peut voir qu'en fait il fait la première ligne et après il considére tout le temps qu'aucune commune n'est nouvelle et il indique uniquement l'espèce.

J'ai sûrement dû loupé quelque chose mais quoi? Ca fait une heure que je retourne ça dans tous les sens et je n'arrive pas à mettre le doigt sur ce qui cloche (fin là suis déjà content que tous les enregistrements s'affichent :lol:)

Désolé mais c'est la première fois que j'utilise des if et else et j'ai un peu de mal.

Posté (modifié)

il te manque juste une ligne en début de boucle, je crois...

$commune = $row["commune"];

dans ton code, lorsque tu fais $prec = $commune la premiere fois, $commune n'est pas defini...

et le tour suivant tu test $commune == $prec... donc c'est forcement vrai...

et ainsi de suite...

Modifié par Nanane
Posté

Je le savais c'était une connerie (pour ne pas changer :lol:)

Niquel ça fonctionne désormais, un peu de mise en page et c'est bon.

En tout cas un grand merci pour ton aide et ta patience ;)

Posté

Pas de soucis ^^

Si tu as des questions sur quoi que ce soit en php, n'hesite pas a m'envoyer un MP. Si c'est a la portée de mes compétences je te repondrai :D

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...