Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 18/01/2011, 15h05   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Par défaut Affichage d'une requête

Bonjour à tous,
Voilà, je souhaiterai afficher les pages consultées (rubriques) par des membres lors de leur visite ; ceci dans un tableau, qui listerait les pages consultées par membre.
Pour cela j'ai créé une requête :

Code :
1
2
3
 
$reponse = $bdd->query('SELECT distinct r.nom, r.id, c.contact_nom, c.contact_prenom, c.contact_pseudo, s.date, s.id_rubrique, s.pseudo  FROM statistiques s INNER JOIN rubrique r ON s.id_rubrique = r.id INNER JOIN contacts c ON s.pseudo = c.contact_pseudo HAVING s.date > NOW()-INTERVAL 1 MONTH ORDER BY c.contact_nom ASC');
$donnees = $reponse->fetch();
et j'ai créé mon tableau :
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
 
<table width="100%">
<tr id="entete-tableau">
<td >Nom</td>
<td>Prénom</td>
<td>Rubrique</td>
</tr>
<?php
while ($donnees = $reponse->fetch())
{
 ?>	
<tr id="tableau">
<td><?php echo $donnees['contact_nom'] ?></td>
<td><?php echo $donnees['contact_prenom'] ?></td>
<td><?php 
$rubrique .= '<br />';
$rubrique .= $donnees['nom'];
echo $rubrique ?></td>
</tr>
<?php
}
 $reponse->closeCursor();
?>
</table>
Or ceci, me retourne pour chaque membre la même liste à laquelle est ajoutée à chaque fois un nouvel élément.
Je suis coincé et n'arrive pas à avancer sur ce pb.
Quelqu'un pourrait-il m'aider ?
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 15h13   #2
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Je ne suis pas bien sûr de ma réponse car je ne suis pas bien sûr de la compréhension du problème mais...

Code sql :
1
2
 
WHERE id_membre = $lid_du_membre

???
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 15h33   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Ce n'est pas très clair en effet.
Le résultat (normal) de la requête retourne autant de lignes que de pages consultées (rubrique), en répétant systématiquement le nom du membre.
Je souhaiterai regrouper le résultat pour qu'il y ait une ligne par membre, et dans cette ligne, une liste des pages consultées.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 16h01   #4
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Le plus simple serait je pense de tester l'id utilisateur.

En algo ça donnerait un truc du genre: (oui, en algo car là j'ai le cerveau en compote :/)

Citation:
-> requete
-> premier enregistrement de la requete
-> affecte id_membre à $variable_iduser.
-> on créé une ligne tableau
-> on met dans une colonne nom/prenom
-> dans la colonne suivante on met la rubrique.
-> on passe à l'enregistrement suivant (de la requête)
-> on teste si l'id_user de l'enregistrement = $variable_iduser
-> si oui, on ajoute simplement la rubrique dans la colonne
-> si non, on finit la ligne de l'utilisateur, on en créé une nouvelle, on met nom/prénom dans une colonne et on change $variable_iduser
-> rebelote
Est-ce compréhensible?
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 16h13   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Merci pour ton aide,
en fait, je ne vois pas comment insérer cette condition au milieu de la boucle.
Je vais faire des recherches, si quelqu'un a une idée, merci par avance.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 04h31   #6
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
ta requete n'est pas correcte si tu cherche a avoir les rubriques ton "from" doit pointer sur ta table rubrique moi je ferai cette requete
Code :
1
2
3
4
5
6
7
8
SELECT DISTINCT r.nom, r.id, c.contact_nom, c.contact_prenom, c.contact_pseudo, s.date, s.id_rubrique, s.pseudo
FROM rubrique r
INNER JOIN statistiques s
ON s.id_rubrique = r.id
INNER JOIN contacts c
ON c.contact_pseudo = s.pseudo
HAVING s.date > NOW()-INTERVAL 1 MONTH
ORDER BY c.contact_nom ASC'
attention au JOIN en mysql il peut retourner null dans les champs concernés il faut mettre les conditions absolues (qui retourne pas de valeur null) dans la clause WHERE ci nécessaire
si DISTINCT ne marche pas comme il faut essai avec GROUP BY sur plusieurs champs
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h14   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Bonjour et Merci pour ton aide.
J'ai modifié la requête, et ai fait plusieurs essais de GROUP BY, mais rien à faire, ma requête retourne autant de lignes que de pages consultées, sans grouper par membre, ce que je voudrais au final.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 11h46   #8
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
je crois avoir compris tu veux la dernière rubrique pour chaque membre.
si c'est le cas ca devrai être un truc du genre

Code :
1
2
3
4
5
6
7
8
9
SELECT r.nom, r.id, c.contact_nom, c.contact_prenom, c.contact_pseudo, s.date, s.id_rubrique, s.pseudo
FROM rubrique r
INNER JOIN statistiques s
ON s.id_rubrique = r.id
INNER JOIN contacts c
ON c.contact_pseudo = s.pseudo
HAVING s.date > NOW()-INTERVAL 1 MONTH
GROUP BY c.contact_pseudo
ORDER BY c.contact_nom ASC, s.date DESC
sinon éclairci ton besoin
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 13h00   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Merci encore pour ton aide,
La requête semble fonctionner très bien.
Ce qui ne colle pas, c'est l'affichage.
En fait je voudrais que l'affichage dans mon tableau soit comme cela :
Citation:
prenom, nom, . page x
. page y
. page z (cad la liste des pages consultées)
prenom2, nom2, . page k
. page l
. page m...
etc...
or ce que j'obtiens actuellement c'est
Citation:
prenom, nom, . page x
prenom, nom, . page y
prenom, nom, . page z
prenom2, nom2, . page k
prenom2, nom2, . page l
prenom2, nom2, . page m...
etc...
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 14h53   #10
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Et sinon plus simple:

Faire une requête qui récupère les membres. Un foreach sur les membres et dans celui ci faire une requete qui récupère l'historique.

Code :
1
2
3
4
foreach($membres as $unMembre){
  $requete = $db->prepare('REQUETE recupere HISTORIQUE WHERE id_user = ?');
  $requete->execute(array($unMembre['id_user']));
}
Et faire pour chaque membre une ligne de tableau
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 15h19   #11
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
essai ceci

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
<?php
/**
 * @filesource Rubrique.php
 * @author helfima
 * @version 1.0
 * Date 19 janv. 2011
 */
 
// ********************************
// ici ajoute la connection a la database $bdd
// ********************************
 
// requete sql
$query = 'SELECT r.nom, r.id, c.contact_nom, c.contact_prenom, c.contact_pseudo, s.date, s.id_rubrique, s.pseudo';
$query.= 'FROM rubrique r';
$query.= 'INNER JOIN statistiques s';
$query.= 'ON s.id_rubrique = r.id';
$query.= 'INNER JOIN contacts c';
$query.= 'ON c.contact_pseudo = s.pseudo';
$query.= 'HAVING s.date > NOW()-INTERVAL 1 MONTH';
$query.= 'GROUP BY c.contact_pseudo';
$query.= 'ORDER BY c.contact_nom ASC, s.date DESC';
// execution requete
$reponse = $bdd->query($query);
// traitement des données
$rubriques = array();
while($row = $reponse->fetch()){
	// preparation du tableau
	// regroupe les lignes par pseudo
	$pseudo = $row['pseudo'];
	$rubriques[$pseudo]['pages'][] = $row;
	$rubriques[$pseudo]['contact_prenom'] = $row['contact_prenom'];
	$rubriques[$pseudo]['contact_nom'] = $row['contact_nom'];
}
 
// header du tableau
$output = '<table width="100%">';
$output.= '<tr id="entete-tableau">';
$output.= '<td >Nom</td>';
$output.= '<td>Prénom</td>';
$output.= '<td>Rubrique</td>';
$output.= '</tr>';
 
foreach ($rubriques as $rubrique) {
	// construit la liste des rubriques
	$list='<ul>';
	for ($i = 0; $i < count($rubrique['pages']); $i++) {
		$list.='<li>'.$rubrique['pages'][i]['nom'].'</li>';
	}
	$list.='</ul>';
	// contruit la ligne du tableau
	$output.= '<tr>';
	$output.= '<td valign="top">'.$rubrique['contact_prenom'].'</td>';
	$output.= '<td valign="top">'.$rubrique['contact_nom'].'</td>';
	$output.= '<td>'.$list.'</td>';
	$output.= '</tr>';
}
$output.= '</table>';
 
echo $output;
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 16h08   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Désolé, j'ai en fait, un pb technique sur le site sur lequel je bosse.
L'hébergeur a changé, cette nuit, le site de serveur, sans me donner la nouvelle adresse... Donc toutes les modifs que je faisais ne changeaient rien à rien, et j'avais l'impression de tomber dingue !!
Je ne vais pas pouvoir faire l'essai avant d'avoir cette nouvelle adresse de serveur, et ne pourrai pas vous répondre avant demain je pense.
Mille mercis pour votre aide, je reviens au plus vite.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 16h51   #13
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
hum, tu travaille sur le serveur de prod!!!
en général on utilise un serveur de test pour valider les modifications
en plus pour les site en php/mysql tu a le choix dans des serveurs clé en main
comme xampp lamp easyphp etc...

sans compter la galère pour tester ton code
modif
upload
test

alors quand local tu supprime le upload d'ou un gain en productivité
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 10h43   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Bonjour à tous,

Tu as parfaitement raison, pour un gain de productivité, pas terrible ; mais là, je travaille sur la partie admin, qui n'est visible que par une personne, donc sans conséquences s'il y a des bugs, et surtout je voulais avoir accès à la base de données pour mes tests.

Encore merci mille fois pour ton code. Je pense qu'on y est presque :
il faut retirer le GROUP BY (qu'il faudrait placer avant le HAVING semble-t-il, sinon fatal error, mais il ne sert à rien apparemment),
et pour la liste des pages, j'ai une liste de points, ce qui suggèrerait que les éléments sont bien là, mais ne s'affichent pas correctement.

J'essaie d'analyser ton code (la construction du tableau, méthode que je ne connaissais pas), et j'avoue ne pas savoir quoi changer, ça me parait pourtant cohérent ; si ce n'est cette ligne, que pour l'instant je n'ai pas trop compris :
Code :
$rubriques[$pseudo]['pages'][] = $row;
bon je vais creuser.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 12h24   #15
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
Code :
1
2
3
$rubriques[$pseudo]['pages'][] = $row;
$rubriques[$pseudo]['contact_prenom'] = $row['contact_prenom'];
$rubriques[$pseudo]['contact_nom'] = $row['contact_nom'];
pour faire simple $rubriques est un tableau multi-direction
le premier noeud [$pseudo] c'est pour regrouper les données selon le pseudo
apres il y a 3 branches
['pages'] regroupe les lignes des rubriques correspondant au pseudo
['contact_prenom'] le prenom du contact
['contact_nom'] le nom du contact

donc quand on boucle sur le premier noeud on a facilement les 3 données, les 2 noeud ['contact_prenom'] et ['contact_nom'] ne sont pas réellement nécessaire puisque qu'on les retrouvera dans ['pages'][0]['contact_prenom'] et ['pages'][0]['contact_nom'] mais ca simplifie l'exploitation

pour finir dans $rubriques[$pseudo]['pages'] tu retrouve toute les lignes de la requete correspondant au $pseudo ainsi on ne perd pas de données

Code :
$rubriques[$pseudo]['pages'][] = $row;
ce code empile chaque ligne $row dans le tableau $rubriques[$pseudo]['pages']

affiche le tableau résultat tu comprendra mieux
Code :
echo '<pre>'.print_r($rubriques, true).'</pre>';
sinon l'erreur du code doit être la case ['nom'] qui est vide
Code :
$list.='<li>'.$rubrique['pages'][i]['nom'].'</li>';
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2011, 14h00   #16
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Merci beaucoup pour les explications, je comprends mieux.

Lorsque je fais le print_r, tous les éléments s'affichent bien.

En revanche, dans l'affichage de mon tableau, je n'ai que les puces et pas les noms des fameuses pages consultées.
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h55   #17
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
copie/colle le print de ton tableau $rubriques que je vois ce qu'il y a dedans
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 09h48   #18
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
Bonjour à tous,
Ci-dessous le print_r (un extrait : 1er contact, 2 pages visitées) :
Code php :
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
Array
(
    [leNomDuContact] => Array
        (
            [pages] => Array
                (
                    [0] => Array
                        (
                            [nom] => leNomDeLaPageVisitee
                            [0] => leNomDeLaPageVisitee
                            [id] => 11
                            [1] => 11
                            [contact_nom] => leNomDuContact
                            [2] => leNomDuContact
                            [contact_prenom] => lePrenomDuContact
                            [3] => lePrenomDuContact
                            [contact_pseudo] => lePseudoDuContact
                            [4] => lePseudoDuContact
                            [date] => 2011-01-18
                            [5] => 2011-01-18
                            [id_rubrique] => 11
                            [6] => 11
                            [pseudo] => lePseudoDuContact
                            [7] => lePseudoDuContact
                        )
 
                    [1] => Array
                        (
                            [nom] => leNomDeLaPageVisitee
                            [0] => leNomDeLaPageVisitee
                            [id] => 11
                            [1] => 11
                            [contact_nom] => leNomDuContact
                            [2] => leNomDuContact
                            [contact_prenom] => lePrenomDuContact
                            [3] => lePrenomDuContact
                            [contact_pseudo] => lePseudoDuContact
                            [4] => lePseudoDuContact
                            [date] => 2011-01-18
                            [5] => 2011-01-18
                            [id_rubrique] => 11
                            [6] => 11
                            [pseudo] => lePseudoDuContact
                            [7] => lePseudoDuContact
                        )
 
                )
 
            [contact_prenom] => lePrenomDuContact
            [contact_nom] => leNomDuContact
        )
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 12h08   #19
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
j'avais dit que l'erreur venait de cette ligne, j'avais oublié le $ devant le i
Code :
1
2
 
$list.='<li>'.$rubrique['pages'][$i]['nom'].'</li>';
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2011, 14h14   #20
Candidat au titre de Membre du Club
 
Inscription : décembre 2008
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2008
Messages : 41
Points : 13
Points : 13
C'est trop génial
je n'aurais jamais pensé à mettre un $ devant le i, pourtant je tournais le pb dans tous les sens...
Merci mille fois ! et j'ai appris plusieurs trucs !
Très bon week end !
MarieNum est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h44.


 
 
 
 
Partenaires

Hébergement Web