Création d'un panier sur un site marchand : Quelle est la bonne solution ?

Eléphant du PHP | 117 Messages

13 oct. 2008, 14:57

Bonjour à tous,
Je voudrais faire un panier sur mon site marchand, le problème est que je ne sais pas comment m'y prendre.
Faut-il créer une table panier ? utiliser des variables de sessions ?

Le problème en créant une variable de session panier est que si l'utilisateur qui a mis un article dans son panier ferme son navigateur, le stock de mon article s'est décrémenté de 1 mais ne s'est pas réincrémenté ...
Je ne vois pas comment gérer ceci.

Si quelqu'un a une idée.

Merci d'avance.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 oct. 2008, 18:47

Le stock ne doit pas être décrémenté que si le panier est confirmé (payé) ce qui donne naissance à une commande effective enregistrable dans la base de données en tant que commande payée. Le panier reste virtuel quelque soit la technique de son déploiement : mémoire de session, fichier disque ou table de base de données.

La technique qui consiste à créer le panier directement dans la base de données, même si il est momentanément temporaire avant de se transformer en commande, est plus avantageuse car elle ne surcharge pas le serveur Web mais le serveur SGBD de données ce qui est plus logique, car le SGBD est plus spécialisé dans la gestion multiutilisateurs de données.
Mais chaque technique a ses avantages et ses inconvénients. La technique de sessions est plus rapide car elle déploie un accès mémoire mais elle dépend de l'activation ou pas des cookies côté navigateur et surcharge la mémoire/disque du serveur Web au niveau de la gestion et la manipulation des données de sessions. La technique fichiers surcharge le système de fichiers et peut engendrer des erreurs d'accès disque mais elle est plus rapide qu'un accès SQL. Et la technique de base de données augmente le taux de requêtes SQL mais les traitements sont plus rapides et les données sont plus cohérentes, validées et sécurisées contrairement aux autres techniques.

Mais pour ta question sur le stock, aucune de ces techniques ne peut éviter le cas de figure que tu évoques car cela relève de la logique métier du programme. Tu dois fixer une règle de gestion pour palier à ce problème. Par exemple : Le stock n'est mis à jour que si le client confirme et paye sa commande. Ce qui semble le plus logique à moins que tu veuilles développer le truc et permettre un système de réservation et à ce moment là, la technique base de données est de mise, car le système de réservation doit être intégré dans ton modèle conceptuel de données.
Modifié en dernier par sadeq le 14 oct. 2008, 22:05, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 117 Messages

14 oct. 2008, 16:21

Ok merci pour cette réponse, je vais m'y mettre, je pense que je vais créer une table panier ou seront stockées tous les paniers des utilisateurs avec sur chaque panier une date de création ou modification.
Et sur chaque page de mon site, je testerai si le panier est innactif depuis plus de 10 minutes, si c'est le cas je le supprime sinon je ne fais rien.

Puis pour la gestion des stocks je décrémenterai le produit une fois le panier valider et pas avant.

Le problème c'est que ce que je vends ce sont des objets uniques pour la plupart, des objets design.

Bref je vais tester avec cette solution, mais ça me parait correct.

Encore merci pour ta réponse.

x@v
Mammouth du PHP | 570 Messages

17 oct. 2008, 14:53

J'ai fais un site e-commerce en utilisant des sessions
http://www.6tnline.com/
Mais je me pose encore la question du meilleurs, table ou session.
Avec les tables ont peux faire des stats sur le panier, mais ont ma dit que sa surchargeait l'application.
Avec les sessions je ne vois pas comment faire ces stats, dans tous les cas je vais utiliser une persistence.
En quoi dois-je croire ?

Eléphant du PHP | 117 Messages

18 oct. 2008, 08:49

Bon j'ai crée mon panier et j'ai fait comme ceci :
J'ai créé un table "Panier" dans ma BDD, et quand un utilisateur ajouter quelque chose à son panier, j'insère son session_id() (unique je pense), son id_utilisateur s'il est connecté ...
Et à minuit je test si dans le panier les objets ont été validés ou non, si leur date d'ajout est supérieure à 20 minutes je supprime les lignes correspondantes dans la table "Panier".

Mon stock de produit n'est décrémenté qu'une fois la commande validée ...
J'espère que ça pourra en aider certains, en tout cas ça fonctionne.

x@v
Mammouth du PHP | 570 Messages

18 oct. 2008, 12:07

la tu mélange tout
le panier et les commandes validés ont chacune leurs tables et oublie les sessions dans ce shéma c'est soit la table ou la session...
Dès qu quelqu'un commande tu enregistre sa commande dans une table et tu effaces sont panier.

Eléphant du PHP | 117 Messages

18 oct. 2008, 14:11

Oui j'ai fait deux tables différentes mais il faut bien supprimer les panier un moment ou un autre.
Si j'ajoute un objet à mon panier, puis que je me déconnecte sans commander, la ligne dans ma table panier est encore présente, il faut donc la supprimer...

x@v
Mammouth du PHP | 570 Messages

18 oct. 2008, 14:29

sa m'avait échaper...
Utiliser le moteur de table MEMORY de mysql, le contenu est stocké en mémoire vive.
La tailles des données est fixe, donc pas de varchard...

Eléphant du PHP | 117 Messages

18 oct. 2008, 15:22

Je ne pense pas avoir compris ...

x@v
Mammouth du PHP | 570 Messages

18 oct. 2008, 16:51

la doc est pas mal faite...
http://dev.mysql.com/doc/refman/5.0/fr/ ... ngine.html
Après il est vrai que c'est à toi de l'implémenter.
la technologie me semble cohérente.
Pour les session tu as encore le tuto de Cyrano, c'est un très bon texte pédagogique.
Moi j'ai hésiter entre utiliser ces tables ou les sessions, j'ai renoncer n'ayant vue personne l'utiliser et faute de temps d'explorer une nouveauté.

Eléphant du PHP | 422 Messages

21 oct. 2008, 15:57

La technique de sessions est plus rapide car elle déploie un accès mémoire
De combien de millisecondes ?
A moins que l'internaute commence à mettre une centaine de millions d'articles dans son panier, la différence de temps sera absolument imperceptible. Tout comme la surcharge du serveur et du système de fichiers.

Dans ce genre de système, le temps de réponse ou la charge n'est absolument pas un argument.

Par contre, une question importante : est-ce que tu veux qu'un internaute puisse conserver son panier d'une visite sur l'autre ? Si oui, c'est la solution base de données qu'il faut mettre en place (avec gestion d'un compte utilisateur).
Si non, utilise les sessions : au moins, tu n'auras pas à mettre en place de système de suppression des paniers non utilisés.

Mammouth du PHP | 959 Messages

21 oct. 2008, 22:38

Au passage, voilà un tuto très bien réalisé par notre cher Mammouth Cyrano :mrgreen:

Eléphant du PHP | 117 Messages

22 oct. 2008, 12:20

J'ai fait mon panier et ça fonctionne très bien.
J'ai créé deux tables, une table "Panier" et une table "Panier_details".
La table panier contient l'id du panier, la session_id du client, et la table panier_details contient l'id du panier, et la description du produit, sa quantite etc.

De cette manière tous les paniers sont stockés dans la base de données.
Et le soir a minuit, je teste si les paniers ont été validés ou non (panier dont la date est dépassée depuis 1h) et je supprime les paniers non validés.

Voila voila, j'espère que cette solution est bonne.

Qu'en pensez-vous ?

ViPHP
AB
ViPHP | 5818 Messages

22 oct. 2008, 18:02

Je vois pas bien l'intérêt de sauvegarder un panier dans une bdd si c'est pour l'effacer ensuite. Dans ce cas, comme le disait Caroube, pourquoi ne pas utiliser simplement les sessions, tu éviterais des accès inutiles à ta bdd.

Enfin bon ta méthode te permettra de faire facilement la transition dans le cas où tu voudrais que les utilisateurs puissent conserver leur panier de sessions en sessions.

Eléphant du PHP | 117 Messages

22 oct. 2008, 18:04

Au niveau sécurité, ce n'est pas mieux d'avoir un panier en base ?