Panier et gestion de la quantité (base de données)

Signaler
Messages postés
3
Date d'inscription
mercredi 12 mai 2004
Statut
Membre
Dernière intervention
21 octobre 2004
-
adilol
Messages postés
14
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
13 décembre 2009
-
Bonjour,

Je crée actuellement un panier virtuel mais contrairement à la majorité des codes que j'ai pu trouvé, il utilise la base de données avec une table temporaire.
But :
gérer la disponibilité des articles. Chaque fois qu'un article est ajouté au panier, une ligne vient s'ajouter dans une table LigneAchat (idpanier,idarticle,qte,....) Cela pour une durée de 5mn. Au delà le panier est supprimé et cela libère les articles.

Actuellement cela fonctionne très bien. Je calcule la disponibilité des articles en fonction des articles vendus et des articles momentanément en cours d'achat.
Par contre j'ai 2 questions :
- comment faire pour supprimer les paniers temporaire dont le délai est dépassé ? J'ai fait un trigger sur ma bdd à chaque ajout au panier mais je pense pas que cela soit assez efficace.
- Comment pensez que cela soit géré ?

merci d'avance

11 réponses

Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Salut!
Je pense que le plus simple est de mettre un champ "expiration", qui contient le timestamp désignant l'expiration.

A la création exp = time() + 1h (par exemple)
et tu l'update à chaque ajout!

@++

R@f

Messages postés
3
Date d'inscription
mercredi 12 mai 2004
Statut
Membre
Dernière intervention
21 octobre 2004

Merci pour ta réponse
en fait j'ai mis en place cette solution mais j'aurais aimé savoir s'il y avait une méthode plus " professionnelle ".

Actuellement je fais le système avec l'expiration et je fais une vérif à chaque modification d'un panier. Cette vérif consiste a supprimer le panier temporaire du gars logué puis supprime tous les autres panier temporaires dépassé.

Mais bon je me demande si ce n'est pas trop lourd où si y a pas plus efficace (trigger, procédure stockée ou encore gestion via code php)
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Alors là, je peux pas t'aider, ;-)

@++

R@f

Messages postés
25
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
15 mars 2005

Salut !

Il n'y a pas de manière plus professionnelle qu'une autre à mon avis
Si tu as un accès total à ton serveur :
Installe y un browser
Crée un script php qui génère une page blanche, qui se recharge toutes les X secondes (à l'aide d'un javascript)
A chaque chargement de la page, tu peux ajouter autant d'instruction de maintenance que tu veux.
C'est peut être du bricolage, mais ça fonctionne à merveille, et c'est très simple à modifier (maintenance ou jour, maintenance toujours! )

Sinon, tu peux faire une procédure stockée qui s'éxecute au lancement de ta SGBD, avec une boucle dans laquelle tu fais un timer
Le problème, c'est qu'il faut que tu maîtrise le PL/SQL ...

En espérant t'avoir été utile ....
Messages postés
3
Date d'inscription
mercredi 12 mai 2004
Statut
Membre
Dernière intervention
21 octobre 2004

merci pour vos réponses :-)
Messages postés
2
Date d'inscription
dimanche 11 décembre 2005
Statut
Membre
Dernière intervention
13 août 2007

Bonjour,


je suis en train de crée un caddie pour mon site avec bases de données  en
fait il se trouve que je n'arrive pas a le mettre en place , il me met toujours
le même message d'erreur <!--[if gte vml 1]><v:shapetype id= "_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\admin\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://www.phpcs.com/imgs2/smile_blush.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

"Parse error : syntax error, unexpected T_STRING, expecting
T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in"


Pouvez vous m'aider merci <!--[if gte vml 1]><v:shape id ="_x0000_i1026" type="#_x0000_t75"
alt="" style='width:11.25pt;height:11.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\admin\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"
o:href="http://www.phpcs.com/imgs2/smile.gif"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

Je n'ai pas fait d'autres pv parce que je pence que c'est en relation








-------------------------

Voici mon code:

<?php require_once('Connections/maugisconect.php'); ?>
<?php
mysql_select_db($database_maugisconect, $maugisconect);$query_rs_pani "SELECT * FROM t_panier, t_vari WHERE panier_rub vari_id  ORDER BY prix ASC";
$rs_pani = mysql_query($query_rs_pani, $maugisconect) or die(mysql_error());
$row_rs_pani = mysql_fetch_assoc($rs_pani);
$totalRows_rs_pani = mysql_num_rows($rs_pani);

class Panier {

  private $panier = array();

    // constructeur
    function __construct(){ // constructeur
        @session_start();
        if (!isset($_SESSION['cart'])) $_SESSION['cart']=array();
        $this->panier =& $_SESSION['cart'];
    }

    // ajouter un article $refproduit
    public function addItem($refproduit="",$nb=1){
        @$this->panier[$refproduit]['quantity'] += $nb;
        if ($nb <= 0) unset ($this->panier[$refproduit]);
    }
   
    // supprimer un article $refproduit
    public function removeItem($refproduit="",$nb=1){
        @$this->panier[$refproduit]['quantity'] -= $nb;
        if ($nb <= 0) unset ($this->panier[$refproduit]);
    }
   
        // choisir la quantité d'article $refproduit
    public function setQuantity($refproduit="",$toSet=""){
        @$this->panier[$refproduit]['quantity'] = $toSet ;
        if ($toSet <= 0) unset ($this->panier[$refproduit]);
    }
   
    // afficher la quantité de produits dans le panier
    // paramètre : $refproduit : permet d'afficher la quantité pour le produit de cette référence
    // si le paramètre est vide, on affiche la quantité totale de produit
    public function showQuantity($refproduit=""){
        if ($refproduit) {
            return $this->panier[$refproduit]['quantity'];
        }else{
            $total = 0;
            foreach($this->panier as $ref => $data) {
                $total += $data['quantity'];
            }
        }
            return $total;
    }
   
    // afficher la liste des articles (et accessoirement, leur quantité)
   
    public function showCart(){
            $list = array();
            $i = 0;
            foreach($this->panier as $ref => $data) {
                $list['ref'][$i] = $ref;
                $list['qte'][$i] = $data['quantity'];
                $i++;
            }
            return $list;
    }
   
} // fin de la classe

mysql_free_result($rs_pani);
?>
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Yop!
Quelle est la ligne qui pose pb?

@++

R@f

"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
Messages postés
2
Date d'inscription
dimanche 11 décembre 2005
Statut
Membre
Dernière intervention
13 août 2007

Merci de ton aide en fait j'ai trouvé, j'avais oublié d'installer le moteur php5
dans MySql.
 
Et encord un grand bravo pour vôtre site il et vraiment sympa.
Messages postés
510
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
23 mai 2008

Le meilleur sous serveur appache pour générer des taches de maintenance automatiques, est d'utiliser les taches CRON.
http://fr.wikipedia.org/wiki/Crontab
Ces taches permettent par exemple d'executer un code tous les x temps. Et c'est mieux que d'utiliser un navigateur sur serveur distant.

++

----------------------
La lumière étant plus rapide que le son, un homme peu paraître brillant avant qu'il se mette a parler
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Salut!
 Ca dépend... "Bien mieux" dépend de ce que tu fait: pas besoin d'utiliser un cron si certains éléments qui devraient être supprimés ne sont visibles que par des visiteurs: il ne gênent pas si personne ne les voit... Et tant que personne ne vient, ca n'augmente pas, donc vive le navigateur, ^^

@++

R@f

"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
Messages postés
14
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
13 décembre 2009

bonjour tout le monde,
 
 
 
 
 
SVP,aidez moi,j ai un probleme a resoudre dans 24h c tellement urgent.
 
 
 
voici le probleme:
 
 
 
je dois creer un trigger qui fait afficher un message d erreur ou changer etat de la commande si date_livraison est moins de 3 jours de la date_commande.
 
 
 
je vous transmis ce que j ai pu faire et aussi l enoncé du probleme et la table commande.
 
 
 
merci
 
et aussi je dois creer un trigger qui fait automatiquement la mise a jour de la qte en stock.
 
 
 
merci beaucoup
 
 
 
voici mon email:  adilmy@hotmail.com
 
 
 
 
 
 
 
 
Pour une commande standard (achat d'un bouquet standard), la cyberboutique  
garantit la disponibilité en inventaire des items composant le  
bouquet seulement si la commande a été passée au moins 3 jours avant la  
date de livraison. Pour les commandes standards effectuées moins de 3  
jours avant la date de livraison, c'est le client qui assume le risque. Il est  
donc très important d'informer ces clients d'une éventuelle pénurie. L'état  
de la commande sera alors « VINV »
 
-------------------------------------------
 
table commande.
 
 
 
 
 
 
 
CREATE TABLE Commande (
      no_Commande                 INTEGER NOT NULL CONSTRAINT pk_Commande PRIMARY KEY,
      courriel                    VARCHAR (40) NOT NULL,
      date_Commande               DATE NOT NULL,
      date_livraison              DATE NOT NULL,
      adresse_Livraison           VARCHAR(80) NOT NULL,
      message_Arrangement_Floral  VARCHAR(80) NOT NULL,
      etat_commande               VARCHAR(80) NOT NULL,
      code_etat                   CHAR(10) NOT NULL,
      typeCommande                VARCHAR(80) NOT NULL,
CONSTRAINT fk_Commande_Client FOREIGN KEY (courriel) REFERENCES Client (courriel),
CONSTRAINT chk_typeCommande CHECK (typeCommande IN('commandeStandard','commandePersonalisee'))
);
 
 
 
--------------------------------------------------------------------- 
 
 
 


voici le trigger que j ai pu faire
 
 
BEFORE INSERT
ON COMMANDE
FOR EACH ROW
BEGIN
 IF (:new.date_commande = :new.date_livraison - 3 )
 THEN raise_application_error(-20001,'état de commande est VINV,le client assume le risque de penurie');
 END IF;
END;