Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 14h50   #1
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Par défaut Tableau dynamique avec while

Bonjour à tous,
Je souhaite réaliser un tableau de statistiques comme suit :
______colonne1 | colonne 2 | colonne 3
ligne1 resultat1 | resultat4 | resultat7
ligne2 resultat2 | resultat5 | resultat8
ligne3 resultat3 | resultat6 | resultat9

Le nombre de colonne et le nombre de ligne sont dynamique, mais j'arrive à afficher mon tableau selon les données que j'ai dans ma base de données, grâce à mysql_num_rows, j'ai donc bien le nombre de ligne et le nombre de colonne, ce que je souhaite faire c'est de remplir mon tableau selon une requête SQL.

Voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
// nombre de colonne
$colonne=$rows_pays;
// nombre de ligne
$ligne=$rows_profession;
echo '<table border="1">';
	for($j=0;$j<=$ligne;$j++){
		echo '<tr>';
		for($i=0;$i<=$colonne;$i++){
			echo '<td>';
			while($stat = mysql_fetch_array($query_stat)){echo $stat[0];}
			echo  '</td>';
			}
	}
echo '</table>';
Mais mon while fait tout foiré
Il ne me met pas les résultats dans les tableaux et ne sont pas bien positionnés, mais quand j'enlève mon while et que je met des valeurs en "durs" cela fonctionne.
Comment construire proprement mon tableau dynamique avec un while ?

Merci de vos réponses.
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h10   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

Quelle forme a ton tableau $stat ? Et comment fais-tu pour savoir que dans ton exemple resultat5 doit être dans la 2ème colonne de la 2ème ligne.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h18   #3
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Code :
Quelle forme a ton tableau $stat ?
Mon $stat est en faite un entier qui me donne le nombre total de professionnel de santé selon un pays

Code :
comment fais-tu pour savoir que dans ton exemple resultat5 doit être dans la 2ème colonne de la 2ème ligne.
Car je veux que la structure de mon tableau soit comme ca.
et que ma table est construite comme ceci :
num_profession | num_pays | tot_stat
1 1 2000
2 1 2500
3 1 300
...
....

Je vais vous donner un exemple concret :

______ France | Espagne | Allemagne
Medecin 2000 | 1500 | 400
Infirmier 2500 | 1280 | 600
Sage femme 3000 | 1600 | 555

J'ai en tout pour le moment 18 lignes, et 8 colonnes, mais bien évidemment cela peux ce modifier par la suite... J'ai donc fait le mysql_num_rows.

Suis-je assez claire ou pas du tout ?
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h27   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Est ce que tu as un index unique dans ta table sur la paire (num_profession/num_pays) ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h28   #5
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Non, j'ai un index unique sur un champs que je n'ai pas mis la car c'est un auto increment.
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h30   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Postes ta requête SQL
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h34   #7
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Alors la je sens que je vais me faire fusiller, actuellement ma requête c'est ca :
Code :
1
2
 
SELECT tot_stat FROM stat_pays_profession
Elle récupère uniquement les stats.

Alors en faite le truc c'est qu'au début ma requête sql ressemblait à ca :
Code :
1
2
3
4
5
 
SELECT nom_pays, nom_profession, tot_stat
FROM pays, stat_pays_profession, profession
WHERE pays.num_pays = stat_pays_profession.num_pays
AND profession.num_profession = stat_pays_profession.num_profession
Mais il me repétait du coup plusieurs fois le même pays, (logique étant donné que j'ai 18 professionnel de santé par pays, et vice versa) alors du coup je vais taper dans plusieurs table...

Une solution ?
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h43   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par Meloooo Voir le message
Code :
1
2
 
SELECT tot_stat FROM stat_pays_profession
Elle récupère uniquement les stats.
Euh, toi tu crois au Père-Noël, non ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h44   #9
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
J'utilisais cette requête uniquement la mise en page de mon tableau...
PS : sérieux le père noël existe pas ?
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h01   #10
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bon, je t'ai adapté un de mes scripts générant des tableaux croisés de ce genre quand les lignes et colonnes sont dynamiques.
J'ai essayé de commenter au mieux et j'espère que tu suiveras bien la logique, en s'y prenant pas à pas c'est tout à fait jouable. On est loin de ton code et de ta malheureuse requête SQL
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
 
$sql = <<<'SQL'
SELECT
   nom_profession,
   nom_pays,
   SUM(tot_stat) AS nbTotal
FROM pays
   INNER JOIN stat_pays_profession ON pays.num_pays = stat_pays_profession.num_pays
   INNER JOIN profession ON stat_pays_profession.num_profession = profession.num_profession
GROUP BY
   nom_profession,
   nom_pays
ORDER BY
   nom_profession,
   nom_pays
SQL;
 
$exec = mysql_query($sql);
 
if ( ! $exec) {
   die ('sql error = ' . mysql_error());
}
 
$data = array();
$prof = array();
$pays = array();
 
while($row = mysql_fetch_assoc($exec)) {
   $data[] = $row;
   // on récupère de manière unique la liste des professions et des pays
   $prof[$row['nom_profession']] = null;
   $pays[$row['nom_pays']] = null;
}
 
$prof   = array_flip($prof);   // inversion clé-valeur
$pays   = array_flip($pays);   // inversion clé-valeur
$nbPays = count($pays);
$nbData = count($data);
sort($pays); // tri des pays par ordre alphabétique (les professions sont déjà triées par le sql)
 
 
$webFormat = array();   // représente le tableau de données final
$webRow = array();      // représente une ligne de données numériques du tableau final
$iData = 0;             // curseur de départ pour la lecture du tableau $data (on le modifiera afin de ne pas parcourir à chaque fois des données déjà traitées)
 
// pour chaque profession
foreach($prof as $profession) {
   // on rempli la ligne de rendu avec des valeurs nulles (dans le cas où il n'y aurait pas de données pour un pays)
   $webRow = array_fill(0, $nbPays, null);
   // on parcourt le tableau des données rattachées à la profession
   for($i = $iData; $i < $nbData; ++$i) {
      // si la profession dans le tableau de données ne correspond plus à la profession en cours de traitement,
      // on s'arrête et on modifie le curseur iData pour la prochaine itération (profession suivante)
      if ($details[$i]['nom_profession'] !== $profession) {
         $iData = $i;
         break;
      }
      // sinon on recherche le n° de colonne du pays
      $posPays = array_search($details[$i]['nom_pays'], $pays, true);
      // enregistrement de la valeur statistique à l'intersection profession/pays
      $webRow[$posPays] = $details[$i]['nbTotal'];
   }
   $webFormat[$profession] = $webRow;
}
 
 
// fonction de sécurisation des données à afficher
$hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES); };
?>
<table>
   <thead>
      <tr>
         <th>&nbsp;</th>
         <?php foreach($pays as $value): ?>
         <th><?php echo $hsc($value); ?></th>
         <?php endforeach; ?>
      </tr>
   </thead>
   <tbody>
   <?php foreach($webFormat as $profession => $webRow): ?>
      <tr>
         <td><?php echo $hsc($profession); ?></td>
         <?php foreach($webRow as $nbTotal): ?>
         <td><?php echo $nbTotal; ?></td>
         <?php endforeach; ?>
      </tr>
   <?php endforeach; ?>
   </tbody>
</table>
Comme toujours, je n'ai rien testé, ça sort du four donc à prendre avec des gants
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h04   #11
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Merci beaucoup, je vais regarder ca de très près, et je reviens vers vous pour des explications... j'en ai une
par contre je ne connais vraiment pas bien les requête avec les inner join, pouvez m'expliquer brièvement le fonctionnement ? Ce sont des "jointures amélioriées" ?
car je viens de lancer la requête dans mon MySql et c'est exactement ca !!
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h12.


 
 
 
 
Partenaires

Hébergement Web