Tableaux croisés php mysql

fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006 - 8 sept. 2005 à 11:29
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006 - 12 sept. 2005 à 14:22
Bonjour,
je ne m'y connais pas vraiment en tableau et je souhaiterais savoir comment effectué un tableau croisé en php, pour l'instant j'arrive à afficher mes colonnes et mes lignes mais j'aimerais croiser ma varaible1 avec ma variable 2 pour obtenir les effectifs 3

exemple :
Param2
mod1 mod2
param1
modalité 1 somme(param3xx) somme(param3xx)
modalité 2 somme(param3xx) somme(param3xx)

(avec en plus éventuellement un total en bout chaque ligne et colonne)

pour l'instant j'arrive à afficher :

param 1 param2 param3
modalité 1 mod1 somme(param3xx)
modalité 1 mod2 somme(param3xx)
....

voici mon script actuel:

<html>
<FORM method="post" action="page5.php">
<select name="param1" onChange="this.form.submit();">
<option value="insee" <?php echo $selected=(isset ($_POST['param1']) && ($_POST['param1']=='insee')?'selected="selected"':'') ?> >insee
</option>
<option value="LIBCOM" <?php echo $selected=(isset ($_POST['param1']) && ($_POST['param1']=='LIBCOM')?'selected="selected"':'') ?> >LIBCOM
</option>
</select>

<select name="param2" onChange="this.form.submit();">
<option value="epci" <?php echo $selected=(isset ($_POST['param2']) && ($_POST['param2']=='epci')?'selected="selected"':'') ?> >epci
</option>
<option value="naf60" <?php echo $selected=(isset ($_POST['param2']) && ($_POST['param2']=='naf60')?'selected="selected"':'') ?> >naf60
</option>
</select>
<select name="param3" onChange="this.form.submit();">
<option value="EFET" <?php echo $selected=(isset ($_POST['param3']) && ($_POST['param3']=='EFET')?'selected="selected"':'') ?> >EFET
</option>
<option value="TEFET" <?php echo $selected=(isset ($_POST['param3']) && ($_POST['param3']=='TEFET')?'selected="selected"':'') ?> >TEFET
</option>
</select>
</form>
<?php
$hostname_local = "localhost";
$database_local = "sirene";
$username_local = "root";
$password_local = "root";
$local = mysql_pconnect($hostname_local, $username_local, $password_local) or die(mysql_error());
?>
<?php


mysql_select_db($database_local, $local);
$query_Recordset1 = "SELECT * FROM sirene_petit GROUP BY $param1, $param2";
$Recordset1 = mysql_query($query_Recordset1, $local) or die(mysql_error());
?>


<title>ESSAI</title>

<col width='300'> <col width='300'> <col width='200'>
----

<?php echo $param1; ?>,
<?php echo $param2; ?>,
<?php echo $param3; ?>

<col width='300'> <col width='300'> <col width='200'>
<?php
while ($data = mysql_fetch_array($Recordset1))
{
?>
<?php echo $data[$param1]; ?>,
<?php echo $data[$param2]; ?>,
<?php echo $data[$param3]; ?>,

<?php } ?>

</HTML>

40 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 12:23
a mon avis, tu devrais réellement revoir ta base. Je ne suis pas sûr
qu'on puisse sortir quelquechose de correct avec une seule table.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 12:25
Surtout que vu le contenu, je suppose que 'est un projet pro...et une
base pourrie sur un projet pro, tu vas vite te heurter à de gros
problèmes : performances, et surtout requêtes infaisables...bref, on
finira par te demander de sortir tel ou tel renseignement de ta base,
en fonction de telle ou telle condition, et tu ne le pourras pas.
D'ailleurs ça commence...avec une meilleure structure, ton affichage
serait nettement plus simple à faire.
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
9 sept. 2005 à 12:38
ben oui je m'en doute bien !!!
mais si je fais plusieurs requetes sur ma table et qu'ensuite j'interroge mes requete plutot que ma base cela revient un peu au même non??
j'en ai marre, je pensais pourtant pouvoir reussir à afficher mes données de manière tabulaire !!!

Et si jamais j'avais 3 tables comme tu me disais plus haut, tu crois que ça serait jouable de présenter les résultats en tableau croisé?? Parce que au pire je peux créer plusieurs tables dans ces cas là !! mais je ne vois en quoi cela va m'aider à présenter les données !!!
merci bien !!!
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 12:46
Tu sais, ça ne se crée pas au hasard, une bdd...Regarde au moins cette page de ce tuto Merise :

http://www.sam-mag.com/P53,53,5,55,,,default.aspx

Tu as les 6 cas importants, il faut bien bien réflêchir là-dessus,
avant de recréer ta base. Une bonne structure te sauvera de bien des
emmerdes ;-) (tu peux lire tout le tuto, il est très intéressant et
très bien foutu).



Créer plusieurs tables (pas trop non plus, il faut un juste milieu) va
t'aider à faire tes requêtes, des requêtes plus malléables, et donc
oui, ça t'aidera pour l'affichage de ces données parceque tu
contrôleras mieux comment elles te parviennent. Là, le problème, c'est
que tu n'arrives pas à récupérer tes données dans un ordre correct
(orde n'est pas le mot mais je ne trouve pas mieux) pour les afficher
sous forme de tableau croisé. Pourquoi ? Parce que, déjà, la
structure de ta base n'st pas une structure de tableau croisé! C'est
une structure de liste. (tout est affiché à la suite...ou plutôt tout
est stocké à la suite, en ligne). De plus, tu as énormément de doublons
inutiles.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
9 sept. 2005 à 13:54
oui je sais que ça ne se crée pas au hasard, mais le problème est que je reçoi cette base de données tel que et donc j'avais imaginer l'utiliser comme ça mais pourquoi pas en faire plusieurs en effet!!!
Bon ben je vais regarder ce que tu m'as dit et je vais essayer de voir comment faire mes bases !!
Merci de ton aide en tout cas !!!
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
9 sept. 2005 à 14:27
base Entreprise :



id | nom_entreprise | effectif | ville

1 |
danone
| 15 | paris

2 |
nestlé
| 25 | paris

3 |
machin
| 50 | St-machin



$sql mysql_query("SELECT SUM(effectif) as total, FROM Entreprise WHERE ville 'paris' ");

$data = mysql_fetch_array($sql);

$effectif_total = $data['total'];



echo $effectif_total; // Affiche 40



Peut être un bon début ;)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 14:45
Tss lol. Ouais. Mais reste à afficher les villes et les entreprises,
sans doublon, dans un tableau croisé lol. M'enfin oui, jolie requête
pour la somme :-)
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
9 sept. 2005 à 14:51
oui ça peut être un début, ce que j'aimerais pouvoir afficher c'est à partir de la base entreprise:

________| Ville
Entreprise | Paris | St-machin|
Danone | 15
Nestlé | 25
st machin | 50
Ou si j'avais 2 Danone à paris (15 et25)2 lignes dans ma table avec paris et danone somme

________| Ville
Entreprise | Paris | St-machin|
Danone | 40
Nestlé | 25
st machin | 50

je souhaite en faite croisé ma variable ville avec entreprise sans sélection d'un modalité !! et en récupérer un total effectif par exemple, tout ceci dans un tableau récapitulatif.
merci bien
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 15:00
je reviens
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
9 sept. 2005 à 16:53
Bon vous allez dire que j'insiste mais je continue dans ma demande, alors depuis tout à l'heure j'ai un peu avancé mais j'ai toujours un broblème avec ma somme d'effectif !!! j'ai l'impression qu'il la comprends pas !! il ne me marque rien !!!
Bon sinon, concernant mon état d'avancement, j'ai bien ma première ligne avec
1ère ligne : HAUT GAUCHE puis nom de ma variable 1
2ème ligne : nom de la varible 2 puis l'ensemble des modalité variable1
3ème ligne : 1ère modalité de la variable 2 et puis plus rien sauf quand je ne mets pas SUM($param3) j'ai toute les effectifs sans somme!!!!

voici ce que j'ai écris pour l'instant : faut que j'y arrive !!!

$sql1 = mysql_query("SELECT DISTINCT $param1 FROM sirene_petit ORDER BY $param1");


$sql2 = mysql_query("SELECT DISTINCT $param2 FROM sirene_petit ORDER BY $param2");


$sql = mysql_query("SELECT SUM($param3) as $som FROM sirene_petit group by $param1, $param2");


?>

<title>ESSAI</title>
<table border="1" width="700">
<tr> <td>HAUT GAUCHE</td> <td><?php echo $param1 ?></td> </tr>
<tr> <td><?php echo $param2 ?></td> <?php while ($col = mysql_fetch_assoc($sql1))
{echo '<td>' , $col[$param1], '</td>';} ?> </tr>

<tr> <?php while ($ligne = mysql_fetch_assoc($sql2))
{echo '<td>' , $ligne[$param2], '</td>'; } ?>

<?php while ($don = mysql_fetch_assoc($sql))
{echo '<td>' , $don[$som], '</td>';} ?>
</tr>
</table
></HTML>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
9 sept. 2005 à 17:12
Et si tu fais :

$sql = "SELECT DISTINCT ville, entreprise, SUM(effectif) as somme FROM
sirene_petit GROUP BY $param1, $param2 ORDER BY $param1, $param2 ";

$query = mysql_query($sql);

while ($data = mysql_fetch_array($query) ) {

echo $data['ville'].' => '.$data['entreprise'].' => '.$data['somme'];

}



T'obtiens quoi ?
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
9 sept. 2005 à 17:43
Pff j'écris n'importe quoi dans ma requete :p

Remplace le nom de tes champs avant de l'éxécuter :D
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
12 sept. 2005 à 09:28
bon il y a du mieux déjà il m'affiche bien la somme en fonction des paramaètres 1 et 2 !! c'est déjà ça !!! maintenant il faut que je trouve la combine pour qu'il m'affiche ça bien dans un tableau croisé !!!

merci bien !!
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
12 sept. 2005 à 10:22
Bon j'avance petit à petit et je pense plus être très loin du resultat, il me manque juste un petit truc (enfin j'espère!!)
Voici ce qu'il m'affiche :


HAUT GAUCHE,
nafg36,
----

ze,
DA,
DE,
DK,
FA,
GA,
HA,
IA,
JA,
KA,
OA,
----

35ZEMP1,
4, 133 </TD>9 </TD>52 </TD>186 </TD>1 </TD>70 </TD>4 </TD>1157 </TD>7 </TD>


ce qui est en rouge est bien disposé là où il faut et en gras ce qui n'est pas bien mis !! ce qui est en gras devrait être à la suite du 4 !!
il me manque plus grand chose je pense qu'il s'agit juste d'une histoire de boucle ou truc comme ça !!
voici mon script si quelqu'un avit une idée !! merci !!

$sql1 = mysql_query("SELECT DISTINCT $param1 FROM sirene_petit ORDER BY $param1");

$sql2 = mysql_query("SELECT DISTINCT $param2 FROM sirene_petit ORDER BY $param2");

$sql = "SELECT DISTINCT $param1, $param2, SUM($param3) as somme FROM sirene_petit GROUP BY $param1, $param2 ORDER BY $param1, $param2 ";
$query = mysql_query($sql);


?>


<title>ESSAI</title>
<table border="1" width="700">
<tr> <td>HAUT GAUCHE</td> <td><?php echo $param1 ?></td> </tr>

<tr> <td><?php echo $param2 ?></td> <?php while ($col = mysql_fetch_assoc($sql1))
{echo '<td>' , $col[$param1], '</td>';} ?> </tr>

<tr> <?php while ($ligne = mysql_fetch_assoc($sql2))
{echo '<td>' , $ligne[$param2], '</td>'; } ?>

<td> <?php while ($data = mysql_fetch_array($query) ) {
echo $data['somme'] ; ?> </td> <?php } ?>

</tr>
</table

</HTML>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 sept. 2005 à 12:10
Hello,



c'est quelle requête qui ne s'affiche pas où il le faut ?

c'est 'somme' ?
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
12 sept. 2005 à 12:17
hello,

ben en fait c'est les deux je croyais que la première s'affichait bien mais en fait non, le principal problème est je crois que je n'arrive pas à faire retourner à la ligne une fois qu'il a lu une ligne !!
En fait pour l'instant il mets tout sur une même ligne (à la suite) !!!
je vais jamais m'en sortir !!!!
Donc globalement, il m'affiche bien mes 2 premières lignes :


GAUCHE,
nafg36,
----

ze,
DA,
DE,
DK,
FA,
GA,
HA,
IA,
JA,
KA,
OA

mais ensuite,il commence à écrire nickel :


35ZEMP1,
4

4=>somme effectif si nafg36=DA
mais les autres sommes au lieu de les mettre à la suite il me les mets en haut de mon tableau !!!
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 sept. 2005 à 12:26
Prends la fin de ton code :



<tr> <?php while ($ligne = mysql_fetch_assoc($sql2))
{echo '<td>' , $ligne[$param2], '</td>'; } ?>

<td> <?php while ($data = mysql_fetch_array($query) ) {
echo $data['somme'] ; ?> </td> <?php } ?>


</tr>



Il y a un soucis. Tu opuvres un <tr> en dehors d'une boucle, ok.
Puis dans la 1ère boucle, tu ouvres <td> et tu le fermes. Ok
aussi, tu mets une valeur entre chaque, donc ces valeurs seront chacune
dans une cellule <td></td>

Par contre, tu fermes ensuite cette oucle (accolade fermante } ), puis
tu écris un <td>. Donc tu ouvres une nouvelle cellule (tjrs sur
la même ligne). Enfin tu rentres dans ta 2de boucle, tu écris une
valeur et tu fermes un </td>. Ce qui veut dire que tu n'ouvres ta
cellule qu'une fois, mais que tu la fermes autant de fois que tu
boucles sur $query. Et ça, ce n'est pas bon.

regarde ton source html (lance ta page, et fais "afficher source").
regarde comment est écrit ton tableau. A mon avis il est foireux. La
règle à ne pas oublier : chaque balise ouvrante doit avoir sa balise
fermante, et inversement. Si tu as un déséquilibre quelconque, c'est
qu'il y a un problème. Pour les tableaux, ce genre de problèmes se
traduit par ce que tu as : des données qui sortent du tableau.
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
12 sept. 2005 à 13:49
alors j'y approche j'y approche enfin il me semble !!!


j'ai désormais un tableau sous la forme :


HAUT GAUCHE,
nafg36,
----

epci,
DA,
DE,
DK,
FA,
GA,
HA,
IA,
JA,
KA,
OA,
----

35EPCI01,
048944974514724151070022115716 ,
----

35EPCI03,
,
----

35EPCI05,
,
----

35EPCI06,
,
----

35EPCI08,
,
----

35EPCI10,
,
----

35EPCI27

En gras, il s'agit des sommes d'effectifs, il faut maintenant que j'arrive à mettre les effectifs dans les bonnes lignes et bonnes colonnes !!! (je crois que ça va être le plus dur !!!)

voici mon script actuel qi quelqu'un à une idée ...!! j'suis preneur !!!

$sql1 = mysql_query("SELECT DISTINCT $param1 FROM sirene_petit ORDER BY $param1");

$sql2 = mysql_query("SELECT DISTINCT $param2 FROM sirene_petit ORDER BY $param2");

$sql = "SELECT DISTINCT $param1, $param2, SUM($param3) as somme FROM sirene_petit GROUP BY $param1, $param2 ORDER BY $param1, $param2 ";
$query = mysql_query($sql);

?>


<title>ESSAI</title>
<table border="1" width="700">
<tr> <td>HAUT GAUCHE</td> <td><?php echo $param1 ?></td> </tr>
<tr> <td><?php echo $param2 ?></td> <?php while ($col = mysql_fetch_assoc($sql1))
{echo '<td>' , $col[$param1], '</td>';} ?> </tr>
<tr>
<?php while ($ligne = mysql_fetch_assoc($sql2))
{
echo '<td>' , $ligne[$param2], '</td>';
?>
<td>
<?php while ($data = mysql_fetch_array($query) )
{
echo $data['somme'] ;
} ?> </td> <?php ?> </tr> <?php } ?>

</table

</HTML>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
12 sept. 2005 à 14:05
C'est de pire en pire ton tableau, lol :



<title>ESSAI</title>
<table border="1" width="700">
<tr> <td>HAUT GAUCHE</td> <td><?php echo $param1 ?></td> </tr>
<tr> <td><?php echo $param2 ?></td> <?php while ($col = mysql_fetch_assoc($sql1))

{echo '<td>' , $col[$param1], '</td>';} ?>
</tr>
<tr>
<?php while ($ligne = mysql_fetch_assoc($sql2))
{
echo '<td>' , $ligne[$param2], '</td>';
?>
<td> => ouverture en dehors de ta boucle sur $query
<?php while ($data = mysql_fetch_array($query) )
{
echo $data['somme'] ;
} ?> </td> => fermeture dedans...<?php ?> </tr> => fermeture du <tr> dans ta boucle alors qu'il a été ouvert dehors <?php } ?>

</table => manque un >

</HTML>
0
fredo35m Messages postés 244 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 12 juillet 2006
12 sept. 2005 à 14:22
alors à priori mon tableau semble désormais correct sauf que comme disait malalam, il va falloir mettre des zéros si jamais les effectifs sont vides !! et là je crois que c'est pas gagné !!
car voici à quoi ressemble mon tableau :

HAUT GAUCHE,
nafg36,
----

epci,
DA,
DE,
DK,
FA,
GA,
HA,
IA,
JA,
KA,
OA,
----

35EPCI01,
0, 4
89, 44
9, 7
45, 147
24, 15
1, 0
70, 0
2, 2
1157, 1
6,
----

35EPCI03, </TD>
----

35EPCI05, </TD>
----

35EPCI06, </TD>
----

35EPCI08, </TD>
----

35EPCI10, </TD>
----

35EPCI27, </TD>

mais maintenant il va falloir mettre les bons chiffres dans les bonnes cases en fonction des valeurs de paramètre!!!

PS : désolé malalam pour mes essais de tableaux mais j'ai tellement essayé dans tout les sens !!!!
Voici mon script (bon maintenant j'espère d'un point de forme en tout cas ....:-(!!

HAUT GAUCHE, <?php echo $param1 ?>,
----
<?php echo $param2 ?>, <?php while ($col = mysql_fetch_assoc($sql1))
{echo '' , $col[$param1], ', ';} ?>
----

<?php while ($ligne = mysql_fetch_assoc($sql2))
{
echo '' , $ligne[$param2], ', ';
?>
<?php while ($data = mysql_fetch_array($query) )
{
?> <?php
echo $data['somme'] ;
} ?>, <?php } ?>
0
Rejoignez-nous