Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
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/06/2006, 09h54   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Par défaut comment créer un historique de navigation à l'aide des sessions ?

Bonjour,

Tout d'abord je précise que je poste là et pas dans sécurité, car même si ça parle des sessions ça à rien à voir avec la sécurisation.

Cela étant dit et comme le nom du sujet l'indique, je souhaite permettre à mes visiteurs identifiés d'avoir à disposition un historique de navigation reprenant les 10 dernières pages vues.

Pour ce qui est d'enregistrer les urls et les noms de page, malgré l'url-rewriting, je sais faire.
Par contre je ne vois pas comment placer 10 pages dans l'historique.
A l'instant où j'écris ça je me dis qu'il faudrait sans doute utiliser un tableau.
Malgré tout je ne vois pas trop comment placer dans le tableau de session (si tableau il doit y avoir) une page s'il n'y en a pas, deux s'il y en a une, trois s'il y en a 4 etc... Puis arriver à 10 remplacer la première par la 11 eme, la seconde par la 12eme etc...

Pourriez-vous m'éclaircir la voie ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h03   #2
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Code :
1
2
3
4
5
6
7
if(count($_SESSION['historique'])<10)
 
       $_SESSION['historique'][]=$url_page;
else{
       unset($_SESSION['historique']);
       $_SESSION['historique'][]=$url_page;
}
voilà, c'est peut-être pas le plus "propre", mais je pense que ça marche(j'ai pas testé)...

@+
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h14   #3
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Ma foi ça m'a l'air aussi simple qu'efficace, merci Spilliaert !

Bon forcément comme ça peut pas fonctionner du premier coup, j'ai un petit souci pour lire le tableau.

Mon code donne ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
if(count($_SESSION['historique'])<10)
 
       $_SESSION['historique'][]=$retour;
else{
       unset($_SESSION['historique']);
       $_SESSION['historique'][]=$retour;
}
for($i=0;$i<sizeof($_SESSION['historique'][]);$i++)
 
    {
    echo $_SESSION['historique'][$i].'<br>'; 
    }
J'ai donc rajouter une boucle for pour lire les 10 éléments du tableau.
Mais cela n'en affichait qu'un. Alors j'ai rajouté [] dans le sizeof, après $_SESSION['historique'], comme vous pouvez voir dans l'exemple.
Maintenant j'obtiens ça :
Code :
1
2
3
Fatal error: Cannot use [] for reading 
in /home.2/site/scripts/liens-inscription.php
 on line 53
Personnellement, la poésie du message me touche, mais je crains que mes visiteurs ne sachent en apprécier la finesse.

Comment éliminer ce message et accessoirement afficher les 10 dernières pages correctement ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h22   #4
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Code :
1
2
3
4
5
6
7
 
$_SESSION['historique'][]=$url_page;
for($i=(count($_SESSION['historique'])-11);$i<(count($_SESSION['historique'])-1);$i++)
 
    {
    echo $_SESSION['historique'][$i].'<br>'; 
    }
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h27   #5
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
le seul problème, c'est que ce code garde tout l'historique et qu'il n'en affiche que les 10 derniers...mais bon, ça peut t'être utile si tu veux, à un moment afficher tout l'historique...
Sinon, si ça te dérange vraiment, pour des raisons de performance, il faudrait trouver un algo qui refait un nouveau tableau à chaque ajout .
ou un truc du style:
Code :
1
2
3
 
for($i=0;$i<(count($_SESSION['historique'])-11);$i++)
     unset($_SESSION['historique'][$i]);
Mais c'est bon comme ça, non?

spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h37   #6
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Mouif forcément, ça pouvait pas être si simple

En plus du problème que tu soulèves (que en ait quand même hein parce que c'est pour un forum où les gens, ont le sait, voit beaucoup de pages et que ça va bouffer de la mémoire), il y en a au moins deux autres.

1) Je comprend pas que s'il n'y a aucune variable de session, l'espace utilisé par la div d'affichage soit le même que s'il y en a 10. Normalement elle devrait grandir au coup par coup et être null si il n'y a aucune variable (elle est pleine de <br> mais pourtant ceux-ci sont dans la boucle, donc ils ne devraient s'afficher qu'au besoin.)
2) Arrivé à 10, le 1er n'est pas remplacé par le 11eme mais tout est effacé. C'est le else qui efface tout au lieu de remplacer le 1 par le 11 je crois.

Bon voyons ça maintenant.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h41   #7
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Citation:
Envoyé par psychoBob
2) Arrivé à 10, le 1er n'est pas remplacé par le 11eme mais tout est effacé. C'est le else qui efface tout au lieu de remplacer le 1 par le 11 je crois.

Bon voyons ça maintenant.
oui; j'ai édité mon poste précédent et le problème est, je crois, résolu
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h54   #8
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Non ça fonctionne pas, j'ai toujours une pile de <br> et ça s'efface à 10. Faut dire que mon code est horrible, attention les yeux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(count($_SESSION['historique'])<10)
 
       $_SESSION['historique'][]=$retour;
else{
       unset($_SESSION['historique']);
       $_SESSION['historique'][]=$retour;
}
if(count($_SESSION['historique'])>0){
for($i=(count($_SESSION['historique'])-11);$i<(count($_SESSION['historique'])-1);$i++)
 
    {
    echo $_SESSION['historique'][$i].'<br>'; 
    }
 
for($i=0;$i<(count($_SESSION['historique'])-11);$i++)
     unset($_SESSION['historique'][$i]);
     }
C'est là que l'on perçoit mieux la distorsion qui existe entre la réalité d'un message pour l'emetteur et celle perçue par le récepteur.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 10h59   #9
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if(count($_SESSION['historique'])<10)
{
     $_SESSION['historique'][]=$url_page;
}
else
{
     for($i=0 ; $i<9 ; $i++)
     {
          $_SESSION['historique'][$i]=$_SESSION['historique'][$i+1],
     }
     $_SESSION['historique'][10]=$url_page;
}
Voici un code qui garde les 10 derniers historique.

Si ca peut aider ...
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h00   #10
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Citation:
C'est là que l'on perçoit mieux la distorsion qui existe entre la réalité d'un message pour l'emetteur et celle perçue par le récepteur.
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$_SESSION['historique'][]=$retour; //on enregistre dans la session
for($i=0;$i<(count($_SESSION['historique'])-11);$i++) //efface les plus anciens tout en gardant une référence dans le tableau
    $_SESSION['historique'][$i]='';
 
if(count($_SESSION['historique'])>0){
for($i=(count($_SESSION['historique'])-11);$i<(count($_SESSION['historique'])-1);$i++)//on parcourt les dix derniers
 
     echo $_SESSION['historique'][$i].'<br>'; 
 
}
@+
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h21   #11
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Merci pour vos codes les gars. J'ai pas tester celui de Kerod pour n'enregistrer que 10 résultats, il y a ce problème que je ne résoud pas : La pile de <br>.

Normalement ils sont dans la boucle for donc s'il n'y a pas de valeur dans la session, ou une ou trois... il ne devrait alors rien s'afficher ou une ligne ou trois etc...
mais là on dirait que ça affiche 10 lignes, mêmes vides, puisqu'il y a 10 <br>
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h27   #12
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Code :
1
2
3
4
5
6
7
8
9
10
11
$_SESSION['historique'][]=$retour; //on enregistre dans la session
for($i=0;$i<(count($_SESSION['historique'])-11);$i++) //efface les plus anciens tout en gardant une référence dans le tableau
    $_SESSION['historique'][$i]='';

if(count($_SESSION['historique'])>0){
for($i=(count($_SESSION['historique'])-11);$i<(count($_SESSION['historique'])-1);$i++)//on parcourt les dix derniers
      if(!empty($_SESSION['historique'][$i]))
     echo $_SESSION['historique'][$i].'<br>'; 
    
}
@+
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h30   #13
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
hello,

je vais aussi y aller de mon grain de sel :

pour enregistrer :
Code :
1
2
3
 
if( count( $_SESSION['historique'] == 10 ) ) array_shift( $_SESSION['historique'] ); //array_shift dépile le premier element du tableau
$_SESSION['historique'][] = $url;
pour afficher :
Code :
1
2
 
echo implode( '<br />' , $_SESSION['historique'] );
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h47   #14
Membre confirmé
 
Avatar de spilliaert
 
Inscription : septembre 2005
Messages : 270
Détails du profil
Informations personnelles :
Âge : 21
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 270
Points : 227
Points : 227
Citation:
Envoyé par Petibidon
hello,

je vais aussi y aller de mon grain de sel :

pour enregistrer :
Code :
1
2
3
 
if( count( $_SESSION['historique'] == 10 ) ) array_shift( $_SESSION['historique'] ); //array_shift dépile le premier element du tableau
$_SESSION['historique'][] = $url;
pour afficher :
Code :
1
2
 
echo implode( '<br />' , $_SESSION['historique'] );
c'est encore la meilleure solution
spilliaert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h52   #15
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Oui alors, il y a juste un problème, c'est que le renouvellement se fait par le bas.
Les liens en bas de la liste est remplacé par le plus récent et on remonte ainsi au lieu de faire descendre la liste en plaçant le plus récent en haut de la pile :c'est un peu déroutant.

Je me suis dit que le code de Petibidon ferait peut-être l'affaire pour ça, mais j'ai dû l'utiliser n'importe comment : si j'ai 9 résultat, je me retrouve avec 8 , si j'en ai 8 avec 7 etc... jusqu'à ce qu'il n'y en ait plus aucun dans la liste.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 11h57   #16
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
mea culpa c'est moi qui ai ecrit n'importe quoi...

j'ai fait une erreur de parenthèse au niveau du count. regarde bien et corrige

chui pas du matin moi...

je vais me fouetter avec des orties.
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 12h20   #17
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Citation:
je vais me fouetter avec des orties
Attends moi j'arrive. A quand une procession de webmaster repentant,se flagealant avec des souris et des claviers d'ordinateur ? ça nous rappelera des souvenirs.

Je dis ça parce que je vois pas ton erreur de parenthèse et en plus je sais pas si le code que tu nous montre généreusement doit être utilisé en l'état ou transposé à l'intérieur de celui de Spilliaert et Maxoo (c'est même pas que je suis pas du matin moi, c'est que je suis une tâche c'est tout).


Mais d'ailleurs, je viens de me dire qu'il était plus judicieux de le faire avec une base de donnée, de manière à ce que lorsque le gars se reconnecte, ils puissent retrouver son historique en un clic. Vous en pensez quoi ? Si c'est valable et ça me semble l'être, le script doit être sensiblement différent, non (nonobstant les requêtes sql) ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 12h38   #18
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
lol ... le mec qui retourne sa chemise dès que y a un problème

mais effectivement c'est mieux une bdd, mais bon ca dépend a chaque fois de ce que tu veux faire, faut te fixer des limites. tout l'historique ou juste 10 liens ... tu vois ??
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 12h38   #19
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
bon bah je suis pas le seul à pas etre du matin

if( count( $_SESSION['historique'] ) == 10 )

le code que je t'ai fourni s'utilise tel quel... c'est juste une maniere différente de faire les choses.

pour ce qui est de la base de données, tout dépend ce que tu veux en faire... mais là oui ca change pas mal de choses...
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2006, 12h43   #20
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon j'ai opté pour la base de donnée ça me semble un bon plus quand même. Tandis que tant que le gars est connecté, il peut toujours faire un retour avec le navigateur, c'est pas tuant.
Mais ça peut être bien de retrouver son historique de navigation de la dernière connexion.
Partons sur 20 liens par exemple, avec une table historique comprenant 2 champs : id du membre et url.
Il y a 20 enregistrement prévu dont la valeur est NULL et qui sont updaté au fur et à mesure des visites (donc ils ne sont nulles que pour les 20 premières pages de la toute première connexion du membre).

Voilà mon code bidouillé vite fait non testé. Cela foire à la fin bien sûr, et en plus je pense que vous aurez sans doute une bien meilleur idée que la série de if...
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
<?php
//on choisit le nombre de tuple 'page' non vide enregistrés dans la table historique pour le membre connecté.
$total="SELECT page FROM historique WHERE idMembre='".$_SESSION[membreConnecte]."'
AND page!="" ";
$result = mysql_query($total) ;
//on affiche les enregistrement dans la page
while ($R = mysql_fetch_array($resultat)) 
{
//affichage
;}
//on récupère le nombre d'enregistrement de la requête initial
$row = mysql_fetch_row($result);
$total = $row[0];
//là on va updater les tuples vide de la table HISTORIQUE, qui comprend 20 tuples de valeur null:
if($total==0)
{//requête pour updater le tuple 1;
;}
if($total==1)
{//requête pour updater le tuple 2;
;}
if($total==20)
{//requête pour updater le tuple 1;
;}
//et là mon script vaut 2 balles parce qu'une fois 20 tuples dans la table, le premier sera sans cesse updaté et les autres resteront à l'identique...
 
?>
(pas moyen de retrouver la page où on colore le code)
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob 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 03h53.


 
 
 
 
Partenaires

Hébergement Web