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

PHP & Base de données Discussion :

Sessions dans base MYSQL (suite au tuto "Sessions et Cookies en PHP")


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Sessions dans base MYSQL (suite au tuto "Sessions et Cookies en PHP")
    Bonjour à tous,

    J'ai un pitit problème avec mes variables de sessions ... je m'explique :
    Pour un client, j'ai utilisé un tuto du site pour réaliser un panier en PHP avec les sessions (rien de plus, pas d'identification) jusque là pas de pb ... sauf que, hébergé chez OVH, mon panier ne dure pas plus de 30 min. sans activité (ce qui ne plait pas au client en question).

    J'ai donc utilisé un autre tuto pour stocker mes sessions dans une base MySQL voici le code du tuto (j'ai fait un copier-coller dans mon code en changeant juste les identifiants de ma base) :

    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
    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
     
    <?php
    /**
     * SGBD est une constante contenant l'adresse du serveur MySQL. [typiquement 'localhost']
     * LOGIN_SGBD est une constante contenant votre login pour la connection au serveur MySQL.
     * MOT_DE_PASSE_SGBD est une constante contenant votre mot de passe pour la connection au serveur MySQL.
     * SESSIONS_BDD est une constante contenant le nom de la base de données où sont stockées les données. [ici, 'my_database']
     * SESSION_TABLE est une constante contenant le nom de la table où sont stockées les données. [ici, 'sessions']
    */
     
    function ouvrir_session($chemin_de_stockage, $nom_de_session)
    {
      $_ENV['nom_de_session'] = $nom_de_session;
      return true;
    }
     
    function fermer_session()
    {
      return true; // Rien à faire
    }
     
    function lire_session($identifiant_de_session)
    {
    @ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
      if(!$mysql)
      {
        return '';
      }
    $resultat = mysql_query('SELECT donnees FROM '.SESSIONS_TABLE.' WHERE identifiant = \''.$identifiant_de_session.'\' AND nom =\''.$_ENV['nom_de_session'].'\'');
      $donnes = '';
      if(mysql_num_rows($resultat) == 1)
      $donnees = mysql_fetch_array($resultat);
      mysql_free_result($resultat);
      mysql_close($mysql);
      return strval($donnes['donnees']);
    }
     
    function ecrire_session($identifiant_de_session, $donnees_de_session)
    {
    @ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
      if(!$mysql)
      {
      	return false;
      }
      $result = true;
    mysql_query('UPDATE '.SESSIONS_TABLE.' SET donnees =\''.$donnees_de_session.'\''.' WHERE identifiant = \''.$identifiant_de_session.'\' AND nom =\''.$_ENV['nom_de_session'].'\'') or $result = false;
      mysql_close($mysql);
      return $result;
    }
     
    function detruire_session($identifiant_de_session)
    {
    @ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
      if(!$mysql)
      {
      	return false;
      }
      $result = true;
    mysql_query('DELETE FROM '.SESSIONS_TABLE.' WHERE identifiant = \''.$identifiant_de_session.'\''.' AND nom =\''.$_ENV['nom_de_session'].'\'') or $result = false;
    mysql_close($mysql);
      return $result;
    }
     
    function verifier_validite_session($temps_de_validite)
    {
    @ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
      if(!$mysql)
      {
      	return false;
      }
      $result = true;
    mysql_query('DELETE FROM '.SESSIONS_TABLE.' WHERE ADDDATE(dernier_acces, INTERVAL '.$temps_de_validite.' SECOND) < NOW()')
        or $result = false;
      mysql_close($mysql);
      return $result;
    }
     
    session_set_save_handler(
      'ouvrir_session',
      'fermer_session',
      'lire_session',
      'ecrire_session',
      'detruire_session',
      'verifier_validite_session'
    );
     
    session_start();
     
    // Maintenant on peut se servir des sessions sans modifications par rapport à avant...
    // C'est complètement transparent pour l'utilisateur.
    ?>
    Ce code est inséré tout en haut de mon header.inc.php et donc se relance à toutes les pages.

    Et bien sûr ça ne marche pas, aucun message d'erreur mais mon caddy reste désespérément vide et dans mas table "sessions", rien ne s'inscrit.

    Le plus bizarre, c'est que si j'ajoute 5 produits (par exemple) avec ce code, je ne vois rien dans mon caddie. Mais si je supprime tout le code au dessus du session_start() (je supprime aussi le session_set_save_handler) et que je rafraichis ma page d'affichage du caddie, mes 5 produits réapparaissent ! Comme si une partie du code au dessus du session_start() était ignorée ...

    J'ai relu le code (et le tuto) hier jusqu'à pas d'heure et je ne comprends toujours pas.

    Si vous aviez quelques pistes ça m'arrangerai et ça m'éviterai de mourir dans d'atroces souffrances de la main d'un philatéliste (mon client !)

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que ta base se remplit bien avec les informations de session ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Pas du tout (et c'est ce qui m'inquiete)

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as défini les 5 constantes indiqués au début ?

  5. #5
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Oui :
    $serveur='localhost';
    $log='root';
    ...

    et j'ai remplacé dans le code

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Tu fais seulement un UPDATE.
    Il faut peut-être commencer par un INSERT pour insérer une ligne associée à l'identifiant de session. Parce qu'un UPDATE ... WHERE identifiant = '...' avec un identifiant qui n'existe pas n'affecte aucune ligne, mais ne renvoie d'erreur pour autant.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    C'est loin d'être stupide ça ...
    Donc, je teste si la session existe, si oui j'UPDATE, sinon j'INSERT.

    Merci, je fais ça ce midi ...

  8. #8
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bon, y a déjà une avancée : ça se mets dans la base de données !
    Pourtant, je suis toujours incapable d'afficher le contenu de ma variable dans mon caddie ...

    Est ce un comportement normal si, quand je ferme mon navigateur puis que je l'ouvre à nouveau pour retourner sur le site, il me recrée une ligne dans la base de données ?

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Oui la session s'arrete quand tu fermes le navigateur.

  10. #10
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    A priori, ça fonctionne ... par contre, à aucun moment dans le script (notamment dans la fonction verifier_validite_session)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function verifier_validite_session($temps_de_validite)
    {
    @ $mysql = mysql_connect(SGBD, LOGIN_SGBD, MOT_DE_PASSE_SGBD); mysql_select_db(SESSIONS_BDD);
      if(!$mysql)
      {
      	return false;
      }
      $result = true;
    mysql_query('DELETE FROM '.SESSIONS_TABLE.' WHERE ADDDATE(dernier_acces, INTERVAL '.$temps_de_validite.' SECOND) < NOW()')
        or $result = false;
      mysql_close($mysql);
      return $result;
    }
    on indique un temps limite en dur (60 sec. par exemple) cela signifie-t-il que tant que le client reste ouvert, la session reste active potentiellement à l'infini ?

  11. #11
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bon apparemment ça marche pas si bien que ça ... au bout d'un certain temps (que je n'arrive pas à définir) la session se vide alors que l'entrée dans la base de données reste là ...

    et ça a l'air aléatoire ...

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Pour fixer la durée de ta session, il faut que tu mettes juste avant le session_start() ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('session.gc_maxlifetime', $temps_de_validite);
    (avec la durée exprimée en secondes)

    Note bien au passage que le fichier de configuration de PHP peut t'empêcher de faire cette modification...

    A priori, quand tu fermes ton navigateur ou que la session expire, la fonction detruire_session() n'est pas appelée, c'est donc normal que la ligne reste en base. Il faudra prévoir un script qui supprime automatiquement les lignes pour lesquelles la date de création est antérieure à "maintenant - (moins) une durée que tu auras fixée".

Discussions similaires

  1. Formulaire. Envoi infos dans base mysql + envoi email
    Par Donald08 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/08/2006, 13h28
  2. Enregistrer données Excel dans Base MySQL
    Par davasm dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 22/05/2006, 14h34
  3. [MySQL] Filtre via formulaire HTML/PHP dans Base mySQL
    Par Al3x dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/01/2006, 16h27
  4. pb d'ajout dans base Mysql
    Par briiice dans le forum Requêtes
    Réponses: 7
    Dernier message: 23/12/2005, 12h19
  5. recuperer des mails stocker dans base MySQL avec Outlook
    Par freddy92110 dans le forum Outlook
    Réponses: 1
    Dernier message: 06/11/2005, 19h26

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