IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Sécurité] comment créer un historique de navigation à l'aide des sessions ?


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    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.

  2. #2
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é)...

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>'; 
        }

  5. #5
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for($i=0;$i<(count($_SESSION['historique'])-11);$i++)
         unset($_SESSION['historique'][$i]);
    Mais c'est bon comme ça, non?


  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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.

  7. #7
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  10. #10
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>'; 
     
    }
    @+

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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.

  12. #12
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>'; 
        
    }
    @+

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    hello,

    je vais aussi y aller de mon grain de sel :

    pour enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo implode( '<br />' , $_SESSION['historique'] );
    Pourfendeur de singletons en croisade

  14. #14
    Membre averti Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Petibidon
    hello,

    je vais aussi y aller de mon grain de sel :

    pour enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo implode( '<br />' , $_SESSION['historique'] );
    c'est encore la meilleure solution

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    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.
    Pourfendeur de singletons en croisade

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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.

  18. #18
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 127
    Points : 2 557
    Points
    2 557
    Par défaut
    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 ??

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    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...
    Pourfendeur de singletons en croisade

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Créer un historique de navigation à partir d'une listview
    Par Rohan21 dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 08/09/2014, 15h17
  2. Réponses: 6
    Dernier message: 18/07/2014, 13h21
  3. Réponses: 1
    Dernier message: 18/02/2007, 11h07
  4. créer une barre de navigation déroulante aide
    Par max45 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/11/2005, 20h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo