web-dev-qa-db-fra.com

Persistance du panier: $ _SESSION ou cookie de navigateur?

Sur un site de commerce électronique sans nom d'utilisateur/identifiant pour conserver les données du panier, serait-il préférable d'utiliser la variable PHP $ _SESSION ou un cookie de navigateur pour conserver les articles dans le panier? Je suis penchant vers $ _SESSION car les cookies peuvent être désactivés, mais aimeraient avoir votre avis.

Merci d'avance pour votre considération.

31
user1193509

Ni

Aucun grand site n'oserait stocker le panier d'un utilisateur dans une session ou un cookie - ces données sont simplement précieuses.

Ce que les clients achètent, lorsqu'ils sélectionnent des articles, combien ils achètent, pourquoi ils ne terminent pas la commande, etc. sont tous très, très important pour votre entreprise.

Utilisez une table de base de données pour stocker ces informations, puis liez-la à la session de l'utilisateur. De cette façon, vous ne perdez pas les informations et vous pouvez revenir en arrière et créer des statistiques basées sur les paniers des utilisateurs ou résoudre des problèmes avec votre processus de paiement.

Enregistrez tout ce que vous pouvez.

Schéma de base de données

Vous trouverez ci-dessous un exemple simplifié de ce à quoi cela pourrait ressembler au niveau de la base de données.

user {
    id
    email
}

product {
    id
    name
    price
}

cart {
    id
    product_id
    user_id
    quantity
    timestamp    (when was it created?)
    expired      (is this cart still active?)
}

Vous pouvez également vouloir diviser la table du panier en plusieurs tables afin de pouvoir suivre les révisions du panier.

Séances

Normal PHP Les sessions se composent de deux parties

  1. Les données (stockées dans un fichier sur le serveur)
  2. Un identifiant unique donné à l'agent utilisateur (navigateur)

Ce n'est donc pas $_SESSION contre $_COOKIE - c'est $_SESSION+$_COOKIE = "session". Cependant, il existe des moyens de modifier cela en utilisant un seul cookie crypté qui contient les données (et donc vous n'avez pas besoin d'un identifiant pour trouver les données). Une autre approche courante consiste à stocker les données dans memcached ou dans une base de données au lieu du système de fichiers afin que plusieurs serveurs puissent y accéder.

Ce que @ Travesty3 dit, c'est que vous pouvez avoir deux cookies - un pour la session et un autre qui est soit un cookie "me garder connecté" (qui existe plus longtemps que le cookie de session), soit un copie des données dans un cookie séparé.

43
Xeoncross

Comme l'a souligné Xeoncross, il est très important de stocker toutes les informations possibles pour l'analyse. Il ne faut donc pas se fier entièrement aux sessions et aux cookies.

Une approche possible est-

tilisez des sessions si vous n'êtes pas connecté

Si l'utilisateur n'est pas connecté, vous pouvez stocker et récupérer les éléments du panier et les éléments de la liste de souhaits de la session à l'aide de $_SESSION en PHP

tilisez la base de données lorsque vous êtes connecté

Si l'utilisateur est connecté, vous pouvez envisager l'une des deux options -

  • Stocker l'article du panier ou l'article de la liste de souhaits uniquement dans la base de données
  • Stockez l'article du panier ou l'article de la liste de souhaits dans la base de données ainsi que dans la session (cela permettra d'économiser certaines de vos requêtes de base de données)

Lorsque l'utilisateur se connecte

Lorsque l'utilisateur se connecte, récupérez tous les éléments du panier et les éléments de la liste de souhaits de la session et stockez-les dans la base de données.

Cela rendra les données persistantes même si l'utilisateur se déconnecte ou change de machine mais jusqu'à ce que l'utilisateur ne se soit pas connecté, il n'y a aucun moyen de stocker les informations de manière permanente, donc elles ne seront pas persistantes.

Obtention des données requises

Chaque fois que vous essayez d'accéder au panier ou à la liste de souhaits, effectuez la vérification suivante -

  • Si l'utilisateur n'est pas connecté, regardez dans la session
  • Si l'utilisateur est connecté, interrogez la base de données si vous stockez uniquement dans la base de données, sinon vous pouvez simplement regarder dans les sessions si vous gardez la session mise à jour avec la base de données
6
MukeshD

Je voudrais le stocker dans une SESSION. Ma liste de souhaits est assez longue et je crains qu'elle ne rentre pas dans le stockage 4K qu'un COOKIE peut occuper. Cela vous oblige à définir le délai d'expiration de la session sur une période plus longue.

remarque: il y a des pays (comme les Pays-Bas, où je suis) qui ont des politiques très strictes sur les cookies, et vous pouvez être contraint par la législation d'utiliser des sessions.

6
JvdBerg

Quelques points pour aider:

Cookies:

  • les informations sont conservées jusqu'à l'expiration du cookie (ce que vous pouvez configurer);
  • ont tendance à ralentir la communication entre le serveur et le client, car elle doit être échangée entre les deux dans chaque demande/réponse;
  • c'est une forme non sécurisée de stockage de données et facile à flairer;
  • ils ont également une limite pour stocker des données.

Session:

  • toutes les informations sont conservées sur le serveur et n'ont donc pas été échangées avec le client.
  • parce qu'il n'est pas partagé sur le réseau, c'est un peu plus sécurisé;
  • toutes les informations sont perdues à la fin de la session;
  • Si vous hébergez dans un hôte partagé, vous pouvez avoir des problèmes avec la fin de la session au milieu d'une opération en raison d'une poussée sur les ressources par l'un des sites hébergés sur le même serveur.

Personnellement, j'irais avec des sessions, car je suppose que c'est une page d'audience petite/moyenne. Si cela se développe, vous feriez mieux avec une structure de base de données simple pour stocker ces données, avec un plan de maintenance pour obtenir une crête de données inutiles (par exemple: les clients qui choisissent certains produits mais ne font pas la caisse).

3
Ricardo Souza

Vous pourriez envisager d'utiliser les deux.

L'inconvénient avec $_SESSION signifie que la session est effacée lorsque le navigateur est fermé.

Utilisez des sessions, mais essayez de remplir les données $ _SESSION à partir d'un cookie, si elles sont disponibles.

3
Travesty3

J'utiliserais une session. Si un utilisateur a désactivé les cookies, la session ne pourra pas démarrer car l'ID de session est stocké sur la machine de l'utilisateur dans un cookie.

Il y a certains paramètres que vous voudrez peut-être examiner afin d'essayer de conserver les sessions plus longtemps.

  • Empêchez la suppression du cookie de session lorsque l'utilisateur ferme son navigateur en exécutant session_set_cookie_params() avec le jeu de paramètres lifetime. Cette fonction doit être exécutée avant session_start()

  • Vous pouvez également étendre la fréquence à laquelle les sessions sont effacées du serveur en modifiant les paramètres de nettoyage de la session session.gc_probability, session.gc_divisor, session.gc_maxlifetime soit dans php.ini ou en utilisant ini_set()

  • Si vous avez d'autres sites Web en cours d'exécution sur le serveur et que vous modifiez les paramètres de récupération de place ci-dessus, vous devrez les définir dans php.ini pour qu'ils s'appliquent à tous les sites Web, ou si vous utilisez ini_set(), vous pouvez également consulter à enregistrer ces sessions dans un répertoire différent de celui des autres sites Web en modifiant session_save_path() . Encore une fois, cela est exécuté avant session_start(). Cela empêchera le ramasse-miettes d'autres sites Web de nettoyer vos sessions étendues pour un site particulier.

  • Je recommanderais également de définir les paramètres de session suivants dans php.ini session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512. Cela devrait vous donner un ID de session cryptographiquement solide avec un risque extrêmement faible de collisions.

  • Et assurez-vous que vous disposez d'un certificat SSL sur votre site pour empêcher les attaques de l'homme du milieu contre votre ID de session.

De toute évidence, un utilisateur peut toujours décider d'effacer manuellement tous ses cookies, ce qui emportera le cookie d'ID de session, mais c'est un risque que je serais prêt à prendre. Si j'étais à mi-chemin d'un système de panier d'achat et que je n'avais pas vérifié, je n'irais pas effacer mes cookies. Je pense toujours que les sessions sont meilleures que l'utilisation de simples cookies.

Les données sont suffisamment sécurisées tant que vous êtes le seul site Web qui a accès à votre répertoire de sessions et que votre ID de session est solide. Et en prolongeant la durée de stockage des sessions du serveur, vos données peuvent persister sur le serveur.

Il existe d'autres mesures que vous pourriez utiliser pour rendre vos séances encore plus fortes. Régénérez votre ID de session toutes les 20 minutes en copiant les données. Enregistrez également les ID de session par rapport aux adresses IP dans une base de données et vérifiez si une adresse IP particulière tente d'envoyer plus de X nombre d'ID de session dans un temps donné pour empêcher quelqu'un d'essayer de forcer brutalement un ID de session.

Vous pouvez également stocker les données dans une base de données liée par l'ID de session, plutôt que dans un fichier de session sur le serveur. Cependant, cela dépend toujours d'un ID de session qui est stocké dans un cookie et pourrait disparaître à tout moment. La seule façon d'être vraiment sûr qu'un utilisateur ne perd pas son panier est de le faire d'abord se connecter et de le stocker dans une base de données.

2
batfastad