Stocker les sessions dans la bdd et les utiliser ?

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’ai des problèmes de perte de session aléatoire sur mon site et j’aimerais les stocker dans ma bdd. J’ai trouvé deux tutos qui se recoupent plus ou moins :

Mais je rencontre plusieurs problèmes :

  • les 2 tutos utilisent des classes et je ne sais pas faire de POO, je ne fais que du procédural.
  • les 2 tutos sont assez anciens et utilisent mysql. Je fais ma connexion à la bdd avec mysqli. Lors d’un précédent problème j’avais vu qu’il fallait passer la connexion en variable mais j’ai essayé de la coller un peu partout dans les tutos mais j’ai invariablement le message d’erreur qu’il manque un argument pour ma connexion.

D’où mes questions :

  • suis-je sur la bonne piste avec session_set_save_handler ?
  • est-ce que je peux mélanger un bout de code pdo ou poo à mon site tout en procédural ? si oui, comment ?

J’espère que quelqu’un pourra m’aider ?

+0 -0

Bonjour !

suis-je sur la bonne piste avec session_set_save_handler ?

Oui, c’est bien toujours cette fonction qu’il faut utiliser pour changer la façon dont les sessions sont stockées. Comme montré dans la documentation, il y a deux façons de s’en servir, mais la première étant basée sur de la POO, si tu ne veux pas t’y mettre, préfère peut-être la seconde avec plein de fonctions en paramètre.

est-ce que je peux mélanger un bout de code pdo ou poo à mon site tout en procédural ? si oui, comment ?

Oui, sans aucun problème. Il suffit de… s’en servir, comme si de rien n’était, au milieu du code procédural. Par exemple pour PDO, pas besoin de t’embêter : au milieu de ton code, tu construits une nouvelle instance et tu t’en sers ; ça ne pose aucun problème que ce soit le seul objet (visible) du code.

// …plein de code procédural…

// Pouf un objet. Le reste reste procédural, y'a aucun soucis.
$pdo = new PDO("mysql:host=localhost;dbname=database;","root","");

// On s'en sert tranquillement sans que ça ne gêne. On peut faire du procédural au
// milieu, vraiment : ce ne sont que des outils, tu t'en sers comme tu veux, tu
// mélanges comme tu veux. :)
$query = $pdo->prepare("UPDATE `users` SET user=:var");
$query->bindParam(":var",$var);
$query->execute();

// …et le code procédural continue…

La POO garde cela dit ses avantages, et apprendre à s’en servir peut être bénéfique ; mais c’est un autre sujet.

+1 -0

ok, merci, ça répond déjà à mes 2 questions. Pour la POO je ne vois que des éloges mais j’ai autant envie d’apprendre que pas de temps malheureusement. J’ai appris seule, d’abord en suivant scrupuleusement tous les cours du temps du Site du Zéro et de monter mon site e-commerce complètement à la main. Mais c’était il y a 10 ans, et depuis j’ai amélioré mon site progressivement obligé par l’évolution du php et autres contraintes, mais là je bloque complètement.

Par contre, pardon, je me suis trompée pour le second lien, c’est vers https://www.jeuweb.org/showthread.php?tid=4203&highlight=stocker+les+sessions que je faisais référence.

+1 -0

Par contre, pardon, je me suis trompée pour le second lien, c’est vers https://www.jeuweb.org/showthread.php?tid=4203&highlight=stocker+les+sessions que je faisais référence.

Attention : je trouve ce cours un peu étrange : il n’appelle pas du tout ßession_set_save_handler et est plutôt tourné vers un usage bien spécifique, trop spécifique. Sans compter que son code est obsolète. Je ne me baserais pas trop dessus…

Enfin, je crois que tu ne te bases pas dessus, mais au cas où, je préfère prévenir :)

our la POO je ne vois que des éloges mais j’ai autant envie d’apprendre que pas de temps malheureusement. J’ai appris seule, d’abord en suivant scrupuleusement tous les cours du temps du Site du Zéro et de monter mon site e-commerce complètement à la main. Mais c’était il y a 10 ans, et depuis j’ai amélioré mon site progressivement dû à l’évolution du php et autres contraintes, mais là je bloque complètement.

Y’a pas de soucis, ce n’est pas une obligation — d’autant plus que l’utiliser est (je trouve) plus simple que de définir de nouvelles classes etc. Là, avec PDO, tu n’as que besoin de t’en servir, rien de plus. :) Ou même utiliser mysqli qui n’est, en apparence, pas du tout orienté objet ; cela dit, il me semble que PDO reste préférable.

+1 -0

Attention : je trouve ce cours un peu étrange : il n’appelle pas du tout ßession_set_save_handler et est plutôt tourné vers un usage bien spécifique, trop spécifique. Sans compter que son code est obsolète. Je ne me baserais pas trop dessus…

Il me semblait bien qu’il manquait un bout :)

Bon, après un nouveau test en partant du premier lien, j’ai avancé ! Je n’avais pas vu la connexion à la base, j’ai donc ajouté mes identifiants, et corriger 2 erreurs au passage dans le code :

  • chaque appel à la table étant fait sur SESS_TABLE non déclaré
  • dans la fonction read, c’est "sess_table" qu’on appelle alors que la table s’appelle "session"

Donc là je dirais que ça marche, je n’ai pas d’erreur qui s’affiche, j’ai ma table qui s’est bien remplie. Le début de la lumière au bout du tunnel.

Et maintenant ? Rien que comme ça mon site va appeler aller dans ma base, chercher le numéro de session et l’appeler tout seul ? Et je vais récupérer mes variables pendant le temps défini en $session_time ? Je n’ai rien d’autre à faire ?

Ok, je viens de faire d’autres tests, et je vois maintenant les variables dans la table et en changeant de pages, je les récupère bien.

Y a plus qu’à l’intégrer à mon site !

+0 -0

Donc maintenant mes sessions se stockent en bdd. J’ai fait quelques manipulations et de nouvelles questions apparaissent.

Déjà je ne comprends pas pourquoi le temps que je fasse des tests j’ai vu apparaitre plusieurs sessions. J’ai un temps de session théorique de 2 heures. Le temps passe très vite, mais il ne s’est pas écoulé 2 heures entre mes tests.

Donc première question, je croyais que session_start() créait une session si elle n’existait pas déjà.

Car à la base, je voulais utiliser le stockage des sessions en bdd pour parer une perte aléatoire de sessions. Je pensais que cela pouvait venir de mon code, une quelconque erreur que je dois chercher, mais là je teste sur des fichiers qui n’ont quasiment rien dedans, juste l’appel à la classe, des enregistrements de variables en session et des echo pour voir comment ça réagit.

En parrallèle, comment est-ce que je peux forcer l’utilisation d’une session enregistrée dans ma base ? J’ai voulu faire test.php?PHPSESSID=num_de_ma_session, mais ça ne fonctionne pas.

En parrallèle, comment est-ce que je peux forcer l’utilisation d’une session enregistrée dans ma base ? J’ai voulu faire test.php?PHPSESSID=num_de_ma_session, mais ça ne fonctionne pas.

Tu ne peux pas faire ça, c’est par défaut interdit avec un paramètre qui s’appelle session.use_only_cookie et pour cause, c’est très dangereux en terme de sécurité. Utilise la fonction session_id pour fixer l’ID de session manuellement.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte