Tableaux croisés php mysql

Signaler
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006
-
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006
-
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

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



si j'ai bien compris...il te faut un tableau multidimmensionnel.



Un petit exemple, pour voir si c'est ce que tu veux.

$coord = array (

'x' => array (0,25,10,48),

'y' => array (10,9,6,152)

);



pour obtenir les coordonnées du point [1][3] :

echo $coord['x'][1]; // affiche 25

echo $coord['y'][3]; // affiche 152



Metyons que les points réels ont le même indice, donc on a 4 points, de 0 à 3. Popur obtenir les coordonnées du point 2 :

$point = 2;

echo $coord['x'][$point];

echo $coord['y'][$point];



on peut évidemment faire des recherches, des comparaisons etc...avec in_array, array_search, array_keys etc...
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

oui je pense que c'est ça !!!


En fait dans ma base mysql j'ai plusieurs variables que je souhaite croisé pour obtenir une valeur.


Exemple de variables : ville entreprise effectif


Et bien je souhaite afficher un tableau résumant les effectifs des villes pour chaque entreprise


Entreprise
Danone | Nestlé Total
Ville


Paris 15 25 40


Rennes 12 10 22

Total 27 35 62

Voici le genre de tableau que je souhaiterais produire.
Pour l'instant les tableau que je produit sont :

Ville Entreprise Effectif
Paris Danone 15
Paris Nestlé 25
Rennes Danone 12
Rennes nestlé 10

Je sais pas si le tableau rend quelque chose mais bon ...
En fait mon but est de croisé 2 variable (ou plus) mais bon on va déjà ce limité à deux pour obtenir une valeur d'une troisième.

Depuis toute à l'heure j'arrive bien à afficher ça si je reprends mon exemple (mais par contre il ne m'affiche pas (Paris, Rennes et les chiffres)!!
merci pour ton coup de main
Entreprise
Danone | Nestlé
Ville
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Il y a plusieurs manières de voir les choses, selon ce que tu veux en faire après.



On peut voir ça :



<?php

$tab['Paris']['Danone'] = 15;

$tab['Paris']['Nestle'] = 25;

$tab['Rennes']['Danone'] = 12;

$tab['Rennes']['Nestle'] = 10;



echo '',print_r ($tab),'

';

?>



C'est facile à remplir à partir de ta base, au moins.

Mais pas super pratique...à réfléchir.
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

En fait ce que je veux faire, c'est de permettre à l'utilisateur d'interroger la base de données, selon ce qu'il souhaite voir s'afficher dans le tableau (dans mon exemple il sélectionne ville, entreprise, effectif).
et donc je souhaite préparer un tableau permettant d'inclure les données de ma base de données. Ensuite si l'utilisateur souhaite un autre variable il a juste à sélectionner dans un menu déroulant la variable à insérer.


Mon principal problème est de savoir comment organisé (structuré) mon tableau pour qu'il affiche les résultats escomptés.

Mais je sais pas si je suis vraiment clair dans ma demande en fait ...!!
il s'agit principalement d'une présentation de résultat sous une forme de tableau croisé.

meric en tout cas
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

En plus je viens de m'apercevoir que même mon premier formulaire avec les données en colonne n'est pas bon !! j'y comprends plus rien !!! j'suis une buse !!!


il ne m'affiche plus rien maintenant !!! alors que je veux juste qu'il fasse la somme en fonction de mes 2 premiers paramètres !!!


Je remets mon code modifié en grand désespoir là !!! j'y comprends plus rien !! mon but est d'afficher la somme du paramètre 3 en fonction des daparamètre 1 et 2!!!


Merci de votre aide !!!

<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 SUM($param3) FROM sirene_petit GROUP BY $param1, $param2";
$Recordset1 = mysql_query($query_Recordset1, $local) or die(mysql_error());


$query_Recordset2 = "SELECT * FROM sirene_petit GROUP BY $param1, $param2";
$Recordset2 = mysql_query($query_Recordset2, $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 ($datab = mysql_fetch_array($Recordset2))
{

?>
<?php echo $datab[$param1]; ?>,
<?php echo $datab[$param2]; ?>,
<?php echo $Recordset1[$param3]; ?>,

<?php } ?>

</HTML>
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ahhh, c'est cosmétique ?? Donne plutôt la structure de ta table (tes tables) concernées).
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

Voici ma structure de ma table :

CREATE TABLE `sirene_petit` (
`id_unique` bigint(20) NOT NULL auto_increment,
`dep` varchar(5) default NULL,
`apet700` varchar(10) default NULL,
`datezone` varchar(10) default NULL,
`insee` varchar(10) default NULL,
`LIBCOM` varchar(30) default NULL,
`naf60` varchar(16) default NULL,
`naf240` varchar(16) default NULL,
`nes16` varchar(10) default NULL,
`nes36` varchar(10) default NULL,
`naf700` varchar(16) default NULL,
`nafg16` varchar(10) default NULL,
`nafg36` varchar(10) default NULL,
`SIRET` varchar(30) default NULL,
`DCRET` double default NULL,
`SIEGE` double default NULL,
`ORIGINE` double default NULL,
`TEFET` double default NULL,
`CODEVOIE` varchar(11) default NULL,
`MODET` double default NULL,
`MARCHET` double default NULL,
`SAISONAT` double default NULL,
`NATURE` double default NULL,
`NOMET` varchar(40) default NULL,
`CADR` varchar(26) default NULL,
`NUMVOIE` double default NULL,
`INDREP` char(1) default NULL,
`TYPEVOIE` char(3) default NULL,
`LIBVOIE` varchar(26) default NULL,
`DISTSP` varchar(26) default NULL,
`CODPOS` double default NULL,
`APEN700` varchar(10) default NULL,
`ZE94` double default NULL,
`NOMEN` varchar(40) default NULL,
`MARCHEN` double default NULL,
`SINGT` double default NULL,
`CJ` double default NULL,
`EFET` double default NULL,
`DATE` varchar(15) default NULL,
`ape` varchar(10) default NULL,
`ics` double default NULL,
`epci` varchar(30) default NULL,
`ze` varchar(30) default NULL,
`pays` varchar(30) default NULL,
`au` varchar(30) default NULL,
`za` varchar(30) default NULL,
`geoZA` varchar(30) NOT NULL default '',
`dateZA` date default '0000-00-00',
`typeid_ZA` varchar(30) NOT NULL default '',
`NRCI_DEBUT` varchar(40) NOT NULL default '',
`RCI` varchar(30) NOT NULL default '',
UNIQUE KEY `id_unique` (`id_unique`),
KEY `DATE` (`DATE`,`insee`),
KEY `insee` (`insee`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ;
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
AAAAAAAAAAAAAAAAARRRRRRRRRRGGGGGGGGGHHHHHHHHHH !!!



T'as pas pu faire plus gros, comme table...??



Ok laisse moi un peu de temps j'ai un truc à finir.
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

pas de problème !!!!!
désolé ......
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Heu tu veux croiser quoi, là-dedans, quels champs ?
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

alors j'aimerais croisé le champ LIBCOM et EPCI pour obtenir le total effectif (EFFET) par LIBCOM et EPCI
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hmm ça va être difficile comme ça, dans la mesure où tout est dans une seule table.

Si je comprends bien, tu as des lignes ou tu as par exemple (je passe les autres champs hein) :

danone, paris, 12

danone, rennes, 10



c'est ça ? Donc 2 lignes pour Danone (ou Rennes).



Il aurait été plus logique de faire plusieurs tables. Simple réflexion : une table entreprise déjà..

Ensuite, une entreprise peut être dans 1 ou plusieurs villes. Peut-etre
(à toi de voir) qu'une ville, elle, ne peut contenir qu'1 seule
entreprise (je veux dire 1 Danone pour rennes, pas 2). Mais bon ptete
pas lol. Restons là-dessus.

Dans ce cas :



1 table villes, avec nom de la ville, id_ville.

1 table entreprise avec un id_entreprise.

1 table effectif, avec ud_ville, id_entreprise, et l'effectif.



Bon c'est à réfléchir avec tous tes champs...cherche "Methode Merise"
sur google, et lis un résumé de cette méthode, surtout les 6 cas pour
designer une base (ouais, y en a 6), en fonction des relations 1-n,
n-n, etc...



Bref après tu veux afficher ttes les entreprises et leur effectif pour la ville de Paris ?

SELECT effect, nom_entreprise FROM effectif ef, entreprise ent WHERE ef.id_ville =$tonchoixdeville



Tu as ta liste.

Après ça devient plus simple pour afficher tout ça comme tu le veux...
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

Oui c'est clair qu'il aurait été mieux d'avoir plus tables, mais le jeu de données viens de l'extérieur et on peut rien y faire !!!

Donc oui, dans ma table je peux avoir plusieurs lignes pour une ville (en reprenant cet exemple), et mon but est par exemple d'afficher la somme des effectifs pour une ville donnée ou pour une entreprise donnée ou (principalement) présenté les données par un croisement c'est à dire que je souhaite afficher les effectifs des entreprises par region par exemple, c'est à dire en ligne on pourrais imaginer l'ensemble des villes de la region et en colonne l'ensemble des entrprises et en résultats la somme des effectifs en fonction de la ville et de l'entrprise -> d'où mon histoire de tableau croisé.
Mais rien que dans mon script (plus haut) il n'arrive pas à afficher la somme des effectifs en mettant tout en colonne donc déjà c'est pas gagné ensuite il s'agit de mettre en forme un formulaire croisé de la forme :
Paramètre 2
Elementa/Paramètre 2 | Elementb/Paramètre 2 ....
Paramètre 1
Elementa/paramètre 1 sommeeffectifaa sommeeffectifab
Elementb/paramètre 1 sommeeffectifba sommeeffectifbb
.... .... ....
Et ça je sais pas comment faire ça !!!
En tout cas merci pour ton aide!!!
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ben c'est normal que tu aies du mal avec cette table.

Ok, mettons que tu cherches par rapport à une ville.



Donc un truc du genre (je ne reprends pas tes champs, j'arrive jamais à
m'en souvenir lol, et j'ai pas envie de remonter voir chaque fois ;-) )
:



SELECT ville, entreprise, effectif FROM table WHERE ville = $ville



Ok ?



tu fais ta requête, ton while...et tu obtiens, pour chaque boucle de
ton while, un tableau (disons que ton while fasse : while ($ligne =
mysql_fetch_assoc ($requete)) ) $ligne contenant tes 3 valeurs.



Il est évident que tu n'écriras pas ça comme tu le veux de cette
manière. Malheureuement, la seule manière que je vois de procéder est
de passer par un intermédiaire. A chaque itération de ta boucle, tu
stockes tes 2 valeurs dans 2 tableaux différents (je dis 2 parce que la
ville est déjà connue, et il y en a une seule) :

$entreprise[] = $ligne['entreprise'];

$effectif[] = $ligne['effectif'];



Après, ça devient plus simple...

Je te donne un exemple basique, à toi de l'améliorer selon tes désirs, bien sûr :



tu crées ton tableau en html

<table> ... etc

la première ligne va contenir les entreprises. Donc tu ouvres ton
<tr>, tu crées un <td> vide qui fera l'angle au gauche vide
de ton tableau, puis tu boucles sur ton tableau $entreprise pour créer
tes <td> :

foreach ($entreprise as $cie) {

echo '<td>', $cie, '<td>';

}



puis tu fermes ton <tr>.

Tu as une seule ville, donc dans ton prochain <tr>, tu ne crées
qu'un <td> avec la ville. tu le fermes. Il doit se trouver sous
ton <td> vide. Puis tu te retrouves sous les <td> de tes
entreprises. Il ne te reste plus qu'à faire pareil que pour les
entreprises : tu boucles sur ton tableau $effectif.

Et enfin, tu fermes ton <tr>, puis ton tableau.



Le principe est le même si tu veux afficher toutes les villes et toutes
les entreprises, mais cette fois tu stockes aussi les villes dans un
tableau.



Voilà, j'espère que ça ira mieux :-)
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ah, et pour les totaux des effectifs : tu l'affiches où tu veux, et pour l'avoir tu fais :

echo array_sum ($effectif);
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Tu peux aussi l'avoir dans ta requete si tu veux...avec SUM, c'est toi qui vois.
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

bon ok, je vais essayé de m'en sortir avec ton aide !! j'espère !! je t'assure rien mais je vais tenter, parce que je suis pas doué avec les tableaux et comme je ne veux pas que ce soit standard mais extensible en fonction de nombre ville etc ... j'ai du mal à visualiser le tout mais j'vais essayé !!!

Pour les totaux c'est ce que j'avais essayé de faire avec SUM mais ça ne m'affichait plus rien !! enfin mon truc devait pas être bien écrit non plus !!!

Encore merci malalam !!!
Bon je vais essayé de construire ce tableau !!!!
merci
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hmm je me rends compte que ça ne résoud pas ton problème de tableau
croisé. Si tu veux plusieurs villes et plusieurs entreprises, c'est
nettement plus complexe. J'avais pensé à plusieurs requêtes, vu que ta
table craint méchamment... ;-) Mais ça va être complexe...j'ai
recommencé 4 fois ce message lol...3 fois en imaginant plusieurs
requêtes, mais la tableau est tro difficile (voire impossible) à créer.
1 fois en stockant dans un tableau multidimensionnel, mais le problème
est le même.



Le principe serait de récupérer tes entreprises par exemple, avec un
DISTINCT pour éviter les doublons : SELECT DISTINCT entreprise FROM
table ORDER BY nom_entreprise ASC (par exemple hein). Et de créer ta
ligne de tableau comme en haut.



Puis de faire de même pour les villes, en créant le tableau idem qu'en haut pour avoir tes villes en colonne.



Enfin, avec tes 2 tableaux (villes et entreprises), faire des requêtes
en bouclant dessus...et c'est là que le bât blesse...ça va faire
BEAUCOUP de requêtes. 1ère requête : tu boucles sur tes
entreprises...puis sur tes villes :



foreach ($entreprise as $cie) {

foreach ($ville as $city) {

...SELECT effectif FROM table WHERE ville=$city AND entreprise=$entreprise

création d'une ligne sous la ligne des
entreprises, à droite de la ville (en fait un 3ème tableau, c'est le
mieux). Mais il faut se débrouiller pour remplir à 0 si
l'entreprise n'est pas présente dans la ville...c'est là le plus
complexe

}

}
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

car si l'entreprise n'est pas présente dans la ville il va me mettre vide non ??
Messages postés
244
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
12 juillet 2006

j'm'en sors pas !!!!

voici ce que j'ai écris !! ça marche bien pour la première ligne mais pas pour les suivantes :
dans mon exemple
$param1=LIBCOM -> libéllé commune
$param2=EPCI -> entreprise
$param3=EFET -> effectif

<?php


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


?>


<title>ESSAI</title>

HAUT GAUCHE, <?php echo $param1 ?>,

----
<?php echo $param2 ?>, <?php while ($ligne = mysql_fetch_assoc($Recordset1))
{echo '' , $ligne[$param1], ', ';} ?>

----
<?php while ($colonne = mysql_fetch_assoc($Recordset1))
{
while ($donnee = mysql_fetch_assoc($Recordset1))
{
echo '----
' , $colonne[$param2], '';
echo '----
' , $donnee[$param3], '';
}
}
?>