Alors, ça bosse dur ?
Voilà sans plus attendre une correction détaillée de l'exercice.
colg.php (je la remets au cas où)
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 | <?php
/*
Neoterranos & LkY
Page colg.php
La colonne de gauche de votre site (page incluse).
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
Aucune information / erreur
--------------------------
*/
?>
<div id="statistiques"><h1>Site</h1>
<a href="<?php echo ROOTPATH; ?>/stats.php?see=nb_membres"><?php echo $num1 = get('nb_membres'); if($num1 <= 1) echo ' membre inscrit'; else echo ' membres inscrits'; ?></a><br/>
<a href="<?php echo ROOTPATH; ?>/stats.php?see=connectes"><?php echo $num2 = get('connectes'); if($num2 <= 1) echo ' visiteur'; else echo ' visiteurs' ?></a><br/>
<a href="<?php echo ROOTPATH; ?>/stats.php?see=passed">Dernières visites</a><br/>
</div>
|
On définit donc
get()
.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | <?php
function get($type) //je ne me suis pas foulé. :D
{
if($type == 'nb_membres')
{
$count = sqlquery("SELECT COUNT(*) AS nbr FROM membres", 1);
return $count['nbr'];
}
else if($type == 'connectes')
{
$count = sqlquery("SELECT COUNT(*) AS nbr FROM connectes", 1);
return $count['nbr'];
}
else
{
return 0;
}
}
?>
|
On définit aussi une fonction de mise en page de la date (inspirée de la gestion des dates du SdZ) :
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 | <?php
function mepd($date)
{
if(intval($date) == 0) return $date;
$tampon = time();
$diff = $tampon - $date;
$dateDay = date('d', $date);
$tamponDay = date('d', $tampon);
$diffDay = $tamponDay - $dateDay;
if($diff < 60 && $diffDay == 0)
{
return 'Il y a '.$diff.'s';
}
else if($diff < 600 && $diffDay == 0)
{
return 'Il y a '.floor($diff/60).'m et '.floor($diff%60).'s';
}
else if($diff < 3600 && $diffDay == 0)
{
return 'Il y a '.floor($diff/60).'m';
}
else if($diff < 7200 && $diffDay == 0)
{
return 'Il y a '.floor($diff/3600).'h et '.floor(($diff%3600)/60).'m';
}
else if($diff < 24*3600 && $diffDay == 0)
{
return 'Aujourd\'hui à '.date('H\hi', $date);
}
else if($diff < 48*3600 && $diffDay == 1)
{
return 'Hier à '.date('H\hi', $date);
}
else
{
return 'Le '.date('d/m/Y', $date).' à '.date('h\hi', $date).'.';
}
}
?>
|
Vous remarquerez que j'ai vraiment un problème avec les
switch, je ne les aime vraiment pas.
C'est notre point de départ, à partir d'ici, vous avez normalement créé
stats.php :
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
52
53
54
55
56
57
58
59 | <?php
/*
Neoterranos & LkY
Page stats.php
Statistiques du site.
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
$_GET['see'] contient des caractères invalides (tentative de hack ?)
--------------------------
*/
session_start();
header('Content-type: text/html; charset=utf-8');
include('includes/config.php');
/********Actualisation de la session...**********/
include('includes/fonctions.php');
connexionbdd();
actualiser_session();
/********Fin actualisation de session...**********/
if($_GET['see'] == '' || !isset($_GET['see']))
{
include('stats/index.php');
}
else
{
if(strpos($_GET['see'], '.') !== FALSE || strpos($_GET['see'], ':') !== FALSE || strpos($_GET['see'], 'http') !== FALSE) //$_GET['see'] contient des caractères invalides (tentative de hack ?)
{
include('stats/index.php');
}
else if(file_exists('stats/'.$_GET['see'].'.php'))
{
include('stats/'.$_GET['see'].'.php');
}
else
{
include('stats/index.php');
}
}
include('includes/bas.php');
mysql_close();
?>
|
Voilà, j'ai procédé ainsi pour inclure autant de fichiers que voulu, cette méthode est sécurisée.
Il n'y a, a priori, rien que vous ne puissiez comprendre.
Passons à stats/nb_connectes.php
Comme vous l'avez vu, nous n'avons absolument pas donné de nom à notre page, le nom sera défini dans la page incluse :
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 | <?php
/*
Neoterranos & LkY
Page nb_membres.php
Affiche une liste complète des membres.
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
Aucune information / erreur
--------------------------
*/
/********En-tête et titre de page*********/
$titre = 'Liste des membres du site';
include('includes/haut.php'); //contient le doctype, et head.
/**********Fin en-tête et titre***********/
?>
<div id="colonne_gauche">
<?php
include('includes/colg.php');
?>
</div>
<div id="contenu">
<div id="map">
<a href="index.php">Accueil</a> => <a href="stats.php?see=nb_membres">Liste des membres</a>
</div>
|
Jusqu'ici, rien de bien nouveau.
Maintenant, nous allons, via une requête, récupérer tous les membres, les classer par ID (SQL le fait très bien), et les afficher dans un tableau, je pense d'ailleurs qu'il peut être utile de revoir le
chapitre de M@teo sur les tableaux (cours XHTML/CSS) :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | <?php
$membre_query = sqlquery("SELECT membre_id, membre_pseudo, membre_inscription
FROM membres
ORDER BY membre_id ASC", 2); //ORDER BY s'occupe du tri !
$i = 0;
?>
<div class="membre_liste">
<table>
<thead>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Date d'inscription</th>
</thead>
<tfoot>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Date d'inscription</th>
</tfoot>
|
Ici, on a préparé la tête et le pied du tableau, n'oubliez pas qu'on les met avant la balise
<tbody>
!
Mais tu ne fais pas de limit dans ta requête SQL ?
Non, pour le moment, on n'en aura pas besoin, mais effectivement, quand on a 113 326 membres inscrits sur son site, et une requête à rallonge avec des jointures pour savoir si le membre est dans tel ou tel groupe (notez que le SdZ semble avoir une façon plus simple de faire : max un groupe pour un membre, donc peut-être pas de requête à rallonge), cela peut devenir utile.

Cependant, on aura besoin de définir une fonction page dans ce cas-là, qui gèrera la position de la page visualisée par rapport à la première et à la dernière page, donc on verra cela plus tard, ce n'est pas indispensable tout de suite.
Affichons maintenant les membres :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | <tbody>
<?php
while(isset($membre_query[$i]))
{
echo '<tr class="ligne_'.($i%2).'">
<td>'.$membre_query[$i]['membre_id'].'</td>
<td><a href="membres/user.php?id='.$membre_query[$i]['membre_id'].'">'.htmlspecialchars($membre_query[$i]['membre_pseudo'], ENT_QUOTES).'</a></td>
<td>'.mepd($membre_query[$i]['membre_inscription']).'</td>
</tr>
';
$i++;
}
if($i == 0) echo '<tr><td colspan="3">Pas de membre trouvé.</td></tr>';
?>
</tbody>
</table>
</div>
</div>
|
Et un peu de CSS :
Code : CSS 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 | table {
margin: auto;
margin-top: 10px;
border: 1px solid black;
text-align: center;
border-collapse: collapse;
}
th {
border: 1px solid black;
text-align: center;
}
td {
border: 1px solid black;
text-align: center;
}
.ligne_0 {
background-color: #dfe5f5;
}
.ligne_1 {
background-color: #edf1f8;
}
|
Voilà ! Votre page
nb_membres est finie !
Vous pouvez l'admirer avec joie !
Passons à l'affichage des connectés, et donc la création de fonctions supplémentaires.
actualiser_session()
:
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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 | <?php
function actualiser_session()
{
if(isset($_SESSION['membre_id']) && intval($_SESSION['membre_id']) != 0) //Vérification id
{
//utilisation de la fonction sqlquery, on sait qu'on aura qu'un résultat car l'id d'un membre est unique.
$retour = sqlquery("SELECT membre_id, membre_pseudo, membre_mdp FROM membres WHERE membre_id = ".intval($_SESSION['membre_id']), 1);
//Si la requête a un résultat (id est : si l'id existe dans la table membres)
if(isset($retour['membre_pseudo']) && $retour['membre_pseudo'] != '')
{
if($_SESSION['membre_mdp'] != $retour['membre_mdp'])
{
//Dehors vilain pas beau !
$informations = Array(/*Mot de passe de session incorrect*/
true,
'Session invalide',
'Le mot de passe de votre session est incorrect, vous devez vous reconnecter.',
'',
'membres/connexion.php',
3
);
require_once('../information.php');
vider_cookie();
session_destroy();
exit();
}
else
{
//Validation de la session.
$_SESSION['membre_id'] = $retour['membre_id'];
$_SESSION['membre_pseudo'] = $retour['membre_pseudo'];
$_SESSION['membre_mdp'] = $retour['membre_mdp'];
mysql_query("UPDATE membres SET membre_derniere_visite = ".time()." WHERE membre_id = ".$_SESSION['membre_id']) or exit(mysql_error());
queries();
}
}
}
else //On vérifie les cookies et sinon pas de session
{
if(isset($_COOKIE['membre_id']) && isset($_COOKIE['membre_mdp'])) //S'il en manque un, pas de session.
{
if(intval($_COOKIE['membre_id']) != 0)
{
//idem qu'avec les $_SESSION
$retour = sqlquery("SELECT membre_id, membre_pseudo, membre_mdp FROM membres WHERE membre_id = ".intval($_COOKIE['membre_id']), 1);
if(isset($retour['membre_pseudo']) && $retour['membre_pseudo'] != '')
{
if($_COOKIE['membre_mdp'] != $retour['membre_mdp'])
{
//Dehors vilain tout moche !
$informations = Array(/*Mot de passe de cookie incorrect*/
true,
'Mot de passe cookie erroné',
'Le mot de passe conservé sur votre cookie est incorrect, vous devez vous reconnecter.',
'',
'membres/connexion.php',
3
);
require_once('../information.php');
vider_cookie();
session_destroy();
exit();
}
else
{
//Bienvenue :D
$_SESSION['membre_id'] = $retour['membre_id'];
$_SESSION['membre_pseudo'] = $retour['membre_pseudo'];
$_SESSION['membre_mdp'] = $retour['membre_mdp'];
mysql_query("UPDATE membres SET membre_derniere_visite = ".time()." WHERE membre_id = ".$_SESSION['membre_id']) or exit(mysql_error());
queries();
}
}
}
else //cookie invalide, erreur plus suppression des cookies.
{
$informations = Array(/*L'id de cookie est incorrect*/
true,
'Cookie invalide',
'Le cookie conservant votre id est corrompu, il va donc être détruit, vous devez vous reconnecter.',
'',
'membres/connexion.php',
3
);
require_once('../information.php');
vider_cookie();
session_destroy();
exit();
}
}
else
{
//Fonction de suppression de toutes les variables de cookie.
if(isset($_SESSION['membre_id'])) unset($_SESSION['membre_id']);
vider_cookie();
}
}
if(isset($_SESSION['membre_id'])) $id = $_SESSION['membre_id'];
else $id = -1;
updateConnectes($id);
}
?>
|
updateConnectes()
et
getIp()
:
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 | <?php
function updateConnectes($id)
{
$ip = getIp();
if($id != -1)
{
$id = $_SESSION['membre_id'];
$additionnal = 1; //la variable à mettre dans connectes_membre
}
else
{
$additionnal = $ip;
}
mysql_query("DELETE FROM connectes WHERE connectes_actualisation < ".(time()-300)) or exit(mysql_error()); //MàJ générale des connectés
mysql_query("INSERT INTO connectes VALUES(".$id.", '".$ip."', '".$additionnal."', ".time().")
ON DUPLICATE KEY UPDATE connectes_actualisation=".time().", connectes_ip='".$ip."'") or exit(mysql_error()); //tiens, tiens, ON DUPLICATE... :o
queries(2);
}
function getIp()
{
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
else return $_SERVER['REMOTE_ADDR'];
}
?>
|
Quelques explications s'imposent.

Je vous ai fait utiliser un champ
connectes_membre, dans lequel on insère ici
$additionnal : à quoi ce champ sert-il ?
Si vous avez bien regardé la structure de la table des connectés, vous avez dû remarquer ceci :
Code : SQL | UNIQUE KEY `membre_id` (`connectes_id`,`connectes_membre`)
|
Cette ligne place une condition d'unicité sur deux champs en même temps :
connectes_id et
connectes_membre.
Une autre façon de voir la ligne SQL que j'ai citée, c'est de l'interpréter en français : "Si, au moment d'une insertion, la valeur de
connectes_id et la valeur de
connectes_membre sont déjà
toutes les deux prises sur une même ligne, retourner une erreur.".
L'intérêt est en effet de permettre à plusieurs visiteurs d'être présents en même temps, donc de comptabiliser chaque IP comme un visiteur, tout en ne permettant à un membre inscrit de n'être comptabilisé qu'une fois, donc que son
IP ne soit pas une condition d'unicité, mais cette fois son
id et
son statut de membre !
Donc si le membre ayant
l'id 1 est connecté, le champ
connectes_id vaut 1, et le champ
connectes_membre vaut 1 aussi, s'il actualise, on lui refuse l'insertion d'une nouvelle ligne, car elle transgresse la condition d'unicité ; par contre, pour les invités, le champ
connectes_membre valant leur IP, on peut avoir sans problèmes plusieurs invités connectés en même temps pour un peu qu'ils aient des IP différents.

Cependant, un problème se pose si un membre ou un invité déjà enregistré dans la table
connectes actualise une page, l'insertion étant refusée, il faut donc faire un
UPDATE.
C'est ici que
ON DUPLICATE KEY UPDATE intervient.
Plutôt que de faire une nouvelle requête pour mettre à jour la connexion, on appose cette condition en fin de requête d'insertion et les champs à mettre à jour.
Cela revient à dire en français : "Si l'insertion transgresse la condition d'unicité, mettre à jour le champ
connectes_actualisation à la valeur
time()
."
Ainsi, on condense deux requêtes en une.
C'est vrai qu'à première vue, ce n'est pas évident ; j'ai essayé de vous expliquer cela le plus simplement possible, mais je sais déjà que mes explications ne conviendront pas à certains, sur la condition d'unicité je ne peux rien faire de plus. Par contre, pour
ON DUPLICATE KEY UPDATE, vous pouvez vous rendre
ici (attention, page en anglais).
On peut enfin attaquer connectes.php
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 | <?php
/*
Neoterranos & LkY
Page connectes.php
Affiche une liste complète des membres connectes.
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
Aucune information / erreur
--------------------------
*/
/********En-tête et titre de page*********/
$titre = 'Liste des connectés';
include('includes/haut.php'); //contient le doctype, et head.
/**********Fin en-tête et titre***********/
?>
<div id="colonne_gauche">
<?php
include('includes/colg.php');
?>
</div>
<div id="contenu">
<div id="map">
<a href="index.php">Accueil</a> => <a href="stats.php?see=connectes&a=<?php echo intval($_GET['a']); ?>">Liste des connectés</a>
</div>
<h1>Liste des connectés</h1>
|
Ensuite, vient le moment de s'occuper du menu, et donc de la requête SQL à effectuer en fonction des liens sélectionnés.
Moi je ne m'embête pas, je fais une condition
if/else if, un
switch est aussi possible.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | <?php
if($_GET['a'] == 1)
{
$id = '';
}
else if($_GET['a'] == 2)
{
$id = ' AND connectes_id = -1';
}
else
{
$id = ' AND connectes_id <> -1';
}
$membre_query = sqlquery("SELECT membre_id, membre_pseudo, connectes_actualisation
FROM connectes
LEFT JOIN membres ON membre_id = connectes_id
WHERE connectes_actualisation > ".(time()-300).$id."
ORDER BY connectes_actualisation DESC", 2);
?>
|
C'est un peu du bidouillage, mais je préfère cela plutôt que de monter trois requêtes différentes.

Passons au mini-menu : comme on veut qu'il soit centré, on va le prendre dans un
div avec la propriété CSS qui convient :
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 | <!--menu//-->
<div class="center">
<?php
if($_GET['a'] == 1 || $_GET['a'] == 2)
{
echo '<a href="stats.php?see=connectes">Voir seulement les membres connectés</a>';
$avt = 1;
}
if($_GET['a'] != 2)
{
if($avt == 1) echo ' - ';
echo '<a href="stats.php?see=connectes&a=2">Voir seulement les invités connectés</a>';
$avt = 1;
}
if($_GET['a'] != 1)
{
if($avt == 1) echo ' - ';
echo '<a href="stats.php?see=connectes&a=1">Voir les membres et les invités connectés</a>';
}
?>
</div>
|
Ici aussi, nous n'affichons que les menus proposant une page différente de celle que l'on visualise actuellement, donc on s'arrange pour rendre cela joli, même s'il faut du coup "bidouiller" un peu (je n'aime pas le mot bidouiller dans ce cas-là, car ce n'est pas vraiment du bidouillage, quelle que soit la méthode employée, le principe est le même, sauf si l'on affiche les trois menus, là au moins on ne s'ennuie pas, même pas besoin de PHP).
Il ne reste plus qu'à mettre le tableau en place, avec des liens pointant sur les membres, mais pas sur les invités :
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
52 | <!--tableau//-->
<table>
<thead>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Dernière connexion</th>
</thead>
<tfoot>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Dernière connexion</th>
</tfoot>
<tbody>
<?php
$i = 0;
while(isset($membre_query[$i]))
{
if($membre_query[$i]['membre_id'] != '')
{
$lien = '<a href="membres/user.php?id='.$membre_query[$i]['membre_id'].'">';
$lien2 = '</a>';
}
else
{
$lien = '';
$lien2 = '';
}
if($membre_query[$i]['membre_id'] == '') //un invité n'a pas de lien, ni d'id.
{
$membre_query[$i]['membre_id'] = 'Non renseigné'; //
$membre_query[$i]['membre_pseudo'] = 'Invité';
}
echo '<tr class="ligne_'.($i%2).'">
<td>'.$membre_query[$i]['membre_id'].'</td>
<td>'.$lien.htmlspecialchars($membre_query[$i]['membre_pseudo'], ENT_QUOTES).$lien2.'</td>
<td>'.mepd($membre_query[$i]['connectes_actualisation']).'</td>
</tr>
';
$i++;
}
if($i == 0) echo '<tr><td colspan="3">Pas de membre trouvé.</td></tr>';
?>
</tbody>
</table>
</div>
|
Voilà pour
connectes.php.
passed.php
Allez, on attaque
passed.php, elle se passe d'explications, elle est très similaire aux précédentes.
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
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
91
92
93
94
95
96
97 | <?php
/*
Neoterranos & LkY
Page passed.php
Affiche une liste complète des dates de visite des membres.
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
Aucune information / erreur
--------------------------
*/
/********En-tête et titre de page*********/
$titre = 'Liste des dernières visites';
include('includes/haut.php'); //contient le doctype, et head.
/**********Fin en-tête et titre***********/
?>
<div id="colonne_gauche">
<?php
include('includes/colg.php');
?>
</div>
<div id="contenu">
<div id="map">
<a href="index.php">Accueil</a> => <a href="stats.php?see=passed">Liste des visites</a>
</div>
<h1>Liste des visites</h1>
<?php
$membre_query = sqlquery("SELECT membre_id, membre_pseudo, membre_derniere_visite, connectes_id
FROM membres
LEFT JOIN connectes
ON membre_id = connectes_id
ORDER BY membre_derniere_visite DESC", 2);
$i = 0;
?>
<div class="membre_liste">
<table>
<thead>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Dernière connexion</th>
<th>Statut</th>
</thead>
<tfoot>
<th>N° du membre</th>
<th>Pseudonyme</th>
<th>Dernière connexion</th>
<th>Statut</th>
</tfoot>
<tbody>
<?php
while(isset($membre_query[$i]))
{
if($membre_query[$i]['connectes_id'] == $membre_query[$i]['membre_id']) //gestion des statuts de connexion
{
$statut = '<span class="actif">Connecté</span>';
}
else
{
$statut = '<span class="inactif">Déconnecté</span>';
}
echo '<tr class="ligne_'.($i%2).'">
<td>'.$membre_query[$i]['membre_id'].'</td>
<td><a href="membres/user.php?id='.$membre_query[$i]['membre_id'].'">'.htmlspecialchars($membre_query[$i]['membre_pseudo'], ENT_QUOTES).'</a></td>
<td>'.mepd($membre_query[$i]['membre_derniere_visite']).'</td>
<td>'.$statut.'</td>
</tr>
';
$i++;
}
if($i == 0) echo '<tr><td colspan="4">Pas de membre trouvé.</td></tr>';
?>
</tbody>
</table>
</div>
</div>
|
Ici, on ne gère pas les invités.
Il ne reste plus qu'à mettre l'index des stats :
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
52
53 | <?php
/*
Neoterranos & LkY
Page index.php
Index des statistiques du site (page incluse).
Quelques indications (utiliser l'outil de recherche et rechercher les mentions données) :
Liste des fonctions :
--------------------------
Aucune fonction
--------------------------
Liste des informations / erreurs :
--------------------------
Aucune information / erreur
--------------------------
*/
/********En-tête et titre de page*********/
$titre = 'Statistiques du site';
include('includes/haut.php'); //contient le doctype, et head.
/**********Fin en-tête et titre***********/
?>
<div id="colonne_gauche">
<?php
include('includes/colg.php');
?>
</div>
<div id="contenu">
<div id="map">
<a href="index.php">Accueil</a> => <a href="stats.php">Statistiques</a>
</div>
<h1>Statistiques</h1>
Bienvenue sur la page des statistiques du site.<br/>
Ici, vous pourrez voir les statistiques concernant les membres, les forums, les news, etc., etc. :)<br/>
Bonne visite !
<h2>Membres</h2>
<div class="center">
-> <a href="stats.php?see=nb_membres">Il y a <?php echo $num1; if($num1 <= 1) echo ' membre inscrit'; else echo ' membres inscrits'; ?>.</a><br/>
-> <a href="stats.php?see=connectes">Il y a <?php echo $num2; if($num2 <= 1) echo ' visiteur'; else echo ' visiteurs' ?>.</a><br/>
-> <a href="stats.php?see=passed">Voir les dernières visites de chaque membre.</a><br/>
</div>
</div>
|
Notez juste que je réutilise les variables définies dans
colg.php ; si vous supprimez le bloc sur les stats dans cette page, alors vous devrez les définir ici.
On définit enfin trois nouvelles propriétés CSS :
Code : CSS 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | .actif {
color: blue;
font-weight: blod;
}
.inactif {
color: red;
font-weight: bold;
}
h2 {
text-align:center;
text-decoration: underline;
color: #507090;
font-family:"trebuchet ms", verdana, sans-serif;
letter-spacing:1.1px;
font-variant:small-caps;
font-weight:bold;
font-size:19px;
margin-top:0;
}
|
Voilà, j'espère que vous avez tout compris.

Passons à l'exercice II !