Version complète: sur le forum Webmaster Hub : Grouper des enregistrements
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Barbarus
Bonjour à tous,

J'essaie de grouper des enregistrements sur une carte.

Bon pour commencer voici le code de cette page

CODE
<?php
//appel du haut de la page

$titre = "Liste des esp&egrave;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&eacute;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 wink.gif
Nanane
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 happy.gif 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 wink.gif
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 biggrin.gif
Barbarus
Merci pour la réponse wink.gif

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

le code:

CODE
<?php
//appel du haut de la page

$titre = "Liste des esp&egrave;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 wink.gif
NorSeb
Bonjour,

Attention sur cette ligne :
CODE
if( $row["commune"] = $prec )

Il manque un '='

CITATION
if( $row["commune"] == $prec )
Nanane
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 wink.gif

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 :
CODE
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 biggrin.gif
Barbarus
Salut,

J'ai modifié le code:

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&eacute;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&eacute;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&eacute;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 laugh.gif (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 laugh.gif)

Désolé mais c'est la première fois que j'utilise des if et else et j'ai un peu de mal.
Nanane
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...
Barbarus
Je le savais c'était une connerie (pour ne pas changer laugh.gif)

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 wink.gif
Nanane
Pas de soucis happy.gif
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 biggrin.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.