1 Dernière modification par gilledunord (21-06-2009 19:08:17)

Sujet : [RESOLU]Problème d'identité panier

Bonjour

je n'y connais rien dans le fonctionnement en php mais en recolant des scripts trouvé par-ci par-la j'arrive à m'en sortir.
Par contre pour les sessions, la je n'y comprend absolument rien.

J'essaye de faire ma petite boutique perso tout simple et qui marche bien.
(en essais ici  http://logicmaison.shos.fr/boutik/accueil.htm  )

par contre je me suis aperçu que si plusieurs personnes fais une commande, tous ce mélange dans ma table, donc des articles non désiré ce retrouve dans la commande.

et le plus bête est que j'ai mis un lien qui efface les deux tables après la fabrication de la commande finale.
Donc si une 2eme commande est faite par une autre personne, il se retrouve avec une commande vide...

Des sessions permettrais de garder les commandes en mémoire et de les envoyer dans une table protèger par le ID du client (en fait je n'en sais rien comment ça marche)

mes deux tables :
CREATE TABLE `client` (
  `id` int(11) NOT NULL auto_increment,
  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `adresse` longtext NOT NULL,
  `cp` varchar(10) NOT NULL,
  `ville` longtext NOT NULL,
  `pays` varchar(20) NOT NULL,
  `mel` longtext NOT NULL,
  `tl` varchar(15) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;


CREATE TABLE `com` (
  `id` int(11) NOT NULL auto_increment,
  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `ref` varchar(20) NOT NULL,
  `type` varchar(40) NOT NULL,
  `titre` varchar(40) NOT NULL,
  `prix` varchar(10) default NULL,
  `qte` varchar(5) default NULL,
  `total` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

Pouvez vous m'aider pour la fabrication des sessions, qui éviterons les mélanges de commande et aussi de ne pas supprimer les commande d'un autre ?

Merci pour votre aide
Cordialement
Gilledunord

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

il te manques des champs dans "com", comment veux tu assigner une commande sans lui attribuer un client?

Re: [RESOLU]Problème d'identité panier

Bonjour

Pouvez vous me dire quels champs manque dans la table com ?

Cordialement
Gilledunord

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

tu peux déjà mettre idclient à la place de id dans la bdd client
puis réjouter dans com, idclient pour attribuer la commande à un client

CREATE TABLE `client` (

  `idclient` int(11) NOT NULL auto_increment,

  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `adresse` longtext NOT NULL,
  `cp` varchar(10) NOT NULL,
  `ville` longtext NOT NULL,
  `pays` varchar(20) NOT NULL,
  `mel` longtext NOT NULL,
  `tl` varchar(15) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;



CREATE TABLE `com` (
  `idcommande` int(11) NOT NULL auto_increment,

`idclient` int(11) NOT NULL,

  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `ref` varchar(20) NOT NULL,
  `type` varchar(40) NOT NULL,
  `titre` varchar(40) NOT NULL,
  `prix` varchar(10) default NULL,
  `qte` varchar(5) default NULL,
  `total` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

5 Dernière modification par gilledunord (16-06-2009 06:54:55)

Re: [RESOLU]Problème d'identité panier

Bonjour
Merci  infobarquee.
J'ai ajouté les id comme vous le suggérez.

CREATE TABLE `client` (
  `idclient` int(11) NOT NULL auto_increment,
  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `adresse` longtext NOT NULL,
  `cp` varchar(10) NOT NULL,
  `ville` longtext NOT NULL,
  `pays` varchar(20) NOT NULL,
  `mel` longtext NOT NULL,
  `tl` varchar(15) default NULL,
  PRIMARY KEY (`idclient`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

CREATE TABLE `com` (
  `idcommande` int(11) NOT NULL auto_increment,
  `idclient` int(11) NOT NULL,
  `date_verif` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  `ref` varchar(20) NOT NULL,
  `type` varchar(40) NOT NULL,
  `titre` varchar(40) NOT NULL,
  `prix` varchar(10) default NULL,
  `qte` varchar(5) default NULL,
  `total` varchar(10) default NULL,
  PRIMARY KEY  (`idcommande`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

Les PRIMARY KEY sont ils bon ? (Je n'ai pas d'erreur en local)

Par contre quelles lignes ou script je dois faire pour les utiliser ?

Merci pour votre aide.

Cordialement
Gilledunord

6

Re: [RESOLU]Problème d'identité panier

Bonsoir,

Il te manque une table produit, une table type et une table tEstCommande qui est issu de l'association entre commande et produit et qui stockera la quantité d'un produit commandé.
La table produit contiendra : ref, titre, prix, idtype.
La table type contiendra : idtype, type qui sera un type de produit.
Les clés primaires sont correctes.
Pourquoi avoir choisi le type longtext plutôt que varchar ?

>> SubTherMiX <<
>> alternux <<

Re: [RESOLU]Problème d'identité panier

Bonjour NooD

Merci pour ta réponse.

Explication de mes fichiers :
En fait ma petite boutik est simple il faut seulement "imprimer" la commande.

La page accueil contient les articles à commander, lorsque l'on clique sur "commande", la partie de cette commande contient ceci :

<form action="modif/ajoutarticle.php" method="post">
   <input type="hidden" name="ref" value="0126">
   <input type="hidden" name="type" value="BASTER">
   <input type="hidden" name="titre" value="Moin lé pa la">
   <input type="hidden" name="prix" value="6.50">   
   <input type="hidden" name="qte" value="1">
   <input type="hidden" name="total" value="6.00">
   <input type="image" name="submit" src="imag/com.gif">

le tout envoyé dans le fichier "ajoutarticle" qui renvoi dans la table "com" puis ce fichier a une redirection vers la page "commande" .
Cette page commande, reçois les données de la table "com" et permet de voir sa commande et de revenir sur la page accueil pour refaire une autre commande, ainsi de suite.

Le client qui a rempli son panier et qui décide de commander, clic sur un lien qui l'envoi sur une autre page pour remplir un formulaire de données personnelles.
A  l'envoi du formulaire les données vont dans la page "ajoutcoor" et ajouter dans la table "client".

Cette page "ajoutcoor" donne un lien pour voir la commande finale à imprimer.
Lorsque l'on clic sur le lien il se passe deux actions.
1 er  action, la page finale s'ouvre pour être imprimé
2 eme action qui part dans le fichier "deltabl" pour vider les 2 tables "com" et "client"

D’où mon problème de sauvegarde d'un éventuel autre client en ligne au même moment.

Tous cela parce que je ni connais pas vraiment en script et  suivant ce que j'arrive à faire.

Avec des sessions (sans cookie) je n'aurais pas besoin de table, mais je ne sais pas les faire

Si vous le voulez je peux vous envoyer mes fichiers pour mieux comprendre et peut être m'aider plus pour le problème de mélange de commandes et de destruction de tables, ou mieux, pour remplacer les tables par des sessions.

Pour les adresses je dois mettre des  "longtext" car parfois les adresses sont de type :
appartement  4, bâtiment "C" rue des bidules etc.

Merci pour votre aide.

Cordialement
Gilledunord

8 Dernière modification par NooD (17-06-2009 09:52:00)

Re: [RESOLU]Problème d'identité panier

Bonjour,

Je maintiens ce que j'ai dit par rapport aux modifications à effectuer dans la base.
En ce qui concerne ton problème de client, tu pourrais obliger le client à se connecter avant de pouvoir remplir son panier.
Sinon tu peux utiliser un numéro de client unique généré aléatoirement (avec une vérification que ce numéro n'existe pas déjà bien sûr).
Enfin, tu peux utiliser les sessions comme tu l'as précisé : http://www.phpsources.org/tutoriel-sessions.htm

Tu ferais mieux de ne rien enregistrer dans la base tant que le client n'a pas finalisé sa commande.
Tu peux stocker la commande dans une variable session et à la fin enregistrer toutes les infos dans la base.

>> SubTherMiX <<
>> alternux <<

Re: [RESOLU]Problème d'identité panier

Merci NooD
Je vais parcourir le site que tu propose, si j'ai la solution je reviendrais donner l'explication.

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

Bonjour NooD

Désolé mais le site proposé n'explique que les "ouverture, fermeture et suppressions de sessions". J'ai parcouru le site sans rien apprendre. Les exemples donnés sont trop court pour moi.

J'ai visité plusieurs autre sites qui expliquent les sessions, (même le "siteduzero" ) mais malheureusement pas d'exemple réel.
Un exemple qu'il suffirait de modifier pour obtenir ce que l'on veut.

Pour moi c'est l'incompréhension totale.
Pourriez vous, s'il vous plait, à partir de ma commande avec les fameux "hidden" (ou autre si cela n'est pas possible) de me dire comment les incrustés dans une session, puis de les accumulés avec d'autres commandes qui grossirais le panier et de les ressortir  après avoir donné les coordonnées du client ?
Merci beaucoup pour votre patience envers moi.

Cordialement
Gilledunord

11 Dernière modification par NooD (17-06-2009 22:50:26)

Re: [RESOLU]Problème d'identité panier

Bonsoir,

Si utilises les sessions alors tu n'as pas besoin de la table client lors de la commande. En fait tu ouvres une session pour chaque client et tu sauvegardes la commande dans une variable (toujours en php) et quand le client finalise sa commande, tu enregistres les informations dans la base de données.
Passer l'id client dans un champ hidden d'un formulaire n'est pas sûr car ce champ peut être modifié par un client qui pourra donc faire une commande pour un autre client... (se faire passer pour un autre client).

Avant de commencer à regarder les sessions, tu devrais normaliser ta base de données comme je l'ai expliqué dans ma première réponse.

ps: pas la peine de me vouvoyer wink

>> SubTherMiX <<
>> alternux <<

Re: [RESOLU]Problème d'identité panier

je pensais a une chose, pourquoi ne pas fair eune table relais pour y inscrire les commandes.
apres validation, tu inscrit reellement dans la bonne table et purge l'autre.
je suis pas trop pour les sessions, car si elle n'est pas "fermee" correctement, il peut y avoir usurpation par un autre client ou personne male intentionnée. ce qui peut provoquer un surplus de commande et des erreurs par la suite.

Re: [RESOLU]Problème d'identité panier

Bonjour NooD et infobarquee
Les sessions !
Dur pour moi, je galère trop, je fouille les forums et aucun n'a d'exemple, juste des bribes de scripts. Puis pas trop conseillé car comme le dit infobarquee, on ne sait pas si c'est fermé.

Les cookies, pas la peine car beaucoup les bloques.

Les "idclient" etc, j'ai mis mais la on ne me dit pas ce que je dois faire ensuite pour garder la commande d'un client sans qu'un autre mélange les commandes.

Faire une table relais ?
Je ne vois pas comment intervenir et je pense que ça reviendra au même que la vraie table qui reçois tout, car les commandes passeront par la table relais pour tous les clients.

Il doit bien avoir un moyen d'utiliser les "id" des commandes du client.
Par exemple :
Dans le panier qui se rempli j'utilise les "id" de chaque commande pour effacer une commande, donc on devrais pouvoir réutiliser ses numéros  "id" pour récupérer seulement les commandes concernés.

Dans la table qui contient toutes les commandes de plusieurs clients, on recherche la commande grâce au "id", est-ce possible ?

$req = mysql_query("SELECT id from com WHERE id='id1', id='id2', id='id3' ") or die ("erreur requête");

Mais la pareil, comment stoker les "id" pour le rappelle des commandes ?

Je commence à avoir mal au crane ha ha ha ha.
Merci à vous deux pour votre aide, on finira bien par trouver la solution…

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

Bonsoir

Je pense avoir trouvé la meilleur solution et ça à l'air de fonctionné.
Modification des tables :

CREATE TABLE `client` (
  `id` int(11) NOT NULL auto_increment,
  `nom` varchar(20) NOT NULL,
  `prenom` varchar(20) NOT NULL,
  `adresse` longtext NOT NULL,
  `cp` varchar(10) NOT NULL,
  `ville` varchar(30) NOT NULL,
  `pays` varchar(20) NOT NULL,
  `mail` longtext NOT NULL,
  `tl` varchar(15) NOT NULL,
  `password` varchar(25) NOT NULL,
  PRIMARY KEY (`idclient`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

CREATE TABLE `com` (
  `id` int(11) NOT NULL auto_increment,
  `nom` varchar(20) NOT NULL,
  `ref` varchar(20) NOT NULL,
  `type` varchar(40) NOT NULL,
  `titre` varchar(40) NOT NULL,
  `prix` varchar(10) default NULL,
  `qte` varchar(5) default NULL,
  `total` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

Je suis arrivé à installer une connection de clients, bon je n'ai pas eu trop de mal vue que je l'ai trouvé presque fait entièrement, juste des modification très simple (ho que je suis modeste ha ha ha)
S'est en sessions, et ma table client.

Donc voila le principe, je récupère le nom du client par la session, je l'ai donc sur toutes les pages. Avec le nom du client je peux récupérer les commandes, récupérer les coordonnées du client et cerise sur le gâteau je peux supprimer les commandes ou données à partir de se nom de client.

Chu trop fort, vive moi... Hum hum restons modeste
Bon aller ! C'est aussi grâce à vous, vous m'avez quand même la puce à l'oreille ha ha ha ha chu trop fort hi hi hi

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

le nom dans com, c'est celui du client?
si 'est ca, tu risque d'avoir un leger problème.
imagines simplement que 2 clients aient le meme nom.......

16

Re: [RESOLU]Problème d'identité panier

Et ce n'est pas optimisé, non dans la table com tu as besoin d un champ client_id qui pointe vers client.id.

lesCigales.ORG sysadm1n
L'hébergeur qui sent bon la lavande - Un control panel qu'il est chouette - Viendez nous parler!
"All that is necessary for evil to triumph is for good men to do nothing."

17 Dernière modification par NooD (19-06-2009 15:08:49)

Re: [RESOLU]Problème d'identité panier

infobarquee a écrit:

je pensais a une chose, pourquoi ne pas fair eune table relais pour y inscrire les commandes.
apres validation, tu inscrit reellement dans la bonne table et purge l'autre.
je suis pas trop pour les sessions, car si elle n'est pas "fermee" correctement, il peut y avoir usurpation par un autre client ou personne male intentionnée. ce qui peut provoquer un surplus de commande et des erreurs par la suite.

Effectivement les sessions peuvent poser problème mais il existe certaines solutions.
Avec les tables, il y aura un problème si le client ne décide de rien acheter finalement. Dans ce cas il y aure des enregistrements obsolètes dans la table commande.
Pour moi, on ne réalise les enregistrements dans les tables qu'une fois qu'on est sûr que les opérations sont confirmées.

toad a écrit:

Et ce n'est pas optimisé, non dans la table com tu as besoin d un champ client_id qui pointe vers client.id.

Et la table com est totalement à revoir... (ex. les produits n'ont rien à faire dans cette table).

>> SubTherMiX <<
>> alternux <<

18

Re: [RESOLU]Problème d'identité panier

Tiens, en parlant de ca je pourrais vous soumettre mes problemes de datamodel avec le système de commandes sur lesCigales smile

lesCigales.ORG sysadm1n
L'hébergeur qui sent bon la lavande - Un control panel qu'il est chouette - Viendez nous parler!
"All that is necessary for evil to triumph is for good men to do nothing."

Re: [RESOLU]Problème d'identité panier

pourquoi pas Toad.
Nood, tu voudrais qu'il passe par OBCD ou je sais plus le nom?

je parlai d'une table tempo qui serait vidée au bout de X minutes, comme ca aucun problème.
le mieux pour la table com à mon avis est :
idcommande
idclient
idproduit
quantité
confirmation
envoyé

et c'est tout, enfin je pense.

20 Dernière modification par NooD (19-06-2009 23:25:13)

Re: [RESOLU]Problème d'identité panier

@toad : ça pourrait être intéressant mais attention, à la moindre erreur les conséquences seront terribles.

@infobarquee :
le problème c'est que tu ne sais pas à quel moment le client a effectivement abandonné sa commande (ou s'il est allé se faire un café).

La table commande ne peut pas contenir les attributs quantite et idproduit simplement car une commande est composée de plusieurs produits (cardinalité * de chaque côté) donc il faut une nouvelle table tEstCommande qui contiendra trois attributs : idcommande, idproduit et quantite.
Ce n'est pas moi qui veut ça, mais la normalisation (ici on est seulement en 2NF).

Sinon, je suppose que tu veux parler de ODBC mais je vois pas ce que tu veux dire wink

>> SubTherMiX <<
>> alternux <<

Re: [RESOLU]Problème d'identité panier

Bonjour à tout le monde

J'étais occupé pour les changements. Infobarquee a raison pour les noms.
Donc j'ai remplacé le nom du client par le "idclient" dans la table client et le "idclient" dans la table "com"
Tout marche sauf pour la destruction des commandes par rapport aux "idclient"
Pour la table client pas de problème d'effacement mais la table "com" ne veut rien savoir et n'éfface pas (plus) les commandes.
Pour effacer les commandes dans "com" je dois ressortir le "idclient" du client pour le renvoyer dans le "idclient" dans com mais la ça coince, voici mes scripts (cafouilli) que j'utilise pour l'effacement :

Fonction qui marcher bien :

<?php

session_start();

$nom = $_SESSION['nom'];

include_once ('prise.php');

$db = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("erreur de connexion");

mysql_select_db($mysql_base,$db) or die ("erreur de connexion base");

$reqmod = mysql_query("DELETE FROM com WHERE nom = '$nom' " ); 

include_once ('prise.php');

$db = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("erreur de connexion");

mysql_select_db($mysql_base,$db) or die ("erreur de connexion base");

$reqmod = mysql_query("DELETE FROM client WHERE nom = '$nom' " ); 

mysql_close();

?>

Fonction qui ne marche plus :

<?php

session_start();

$nom = $_SESSION['nom'];

include('prise.php');

//suppression des coordonnées client et ça marche///
$db = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("erreur de connexion");

mysql_select_db($mysql_base,$db) or die ("erreur de connexion base");

$reqmod = mysql_query("DELETE FROM client WHERE nom = '$nom' " );

//-------------------------------------------------------//
//reprise du idclient - je n'obtiens rien - essayer avec echo//

include('prise.php');

$db = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("erreur de connexion");

mysql_select_db($mysql_base,$db) or die ("erreur de connexion base");

$reqmod = mysql_query("SELECT idclient FROM client WHERE nom = '$nom'");
$resultat = mysql_fetch_array($reqmod);
$resultat['idclient'];

//normalement renvoi du idclient pour l'effacement mais pas de reception idclient//
include("prise.php");

$db = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die ("erreur de connexion");

mysql_select_db($mysql_base,$db) or die ("erreur de connexion base");

$reqmod = mysql_query("DELETE FROM com WHERE nom = '$resultat' " );

mysql_close();

?>

Je continu mes essais.

Je remercie tout le monde pour l'aide que vous m'apporter.

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

Re Bonjour

J'ai trouvé l'erreur, en fait j'ais inversé les commandes d'effacement, je détruits le "idclient" et je le rappel donc c'est normale que ça ne marche plus, la j'ai remis l'effacement de la table com en 1er et l'effacement de la table client en dernier et la ça marche.

Il me reste à vérifier s'il ni a pas d'erreur possible dans la commande.

Cordialement
Gilledunord

Re: [RESOLU]Problème d'identité panier

déjà c'est une erreur d'effacer les coordonnées du client dans la table client, même s'il ne commande pas.
un fichier prospects, ca vaut de l'argent.
après si tu ne fais pas une boucle pour effacer chaque enregistrement qui correspond à idclient dans com, ca ne risque pas de fonctionner.
en plus si le client fait 2 commandes dans un intervale assez court et qu'il efface la deuxième commande, avec ce que tu fais, ca efface aussi la 1ere, pas glop.
il faut que tu trouves une parade pour que chaque commande corresponde à un numéro unique.

Re: [RESOLU]Problème d'identité panier

Bonjour Infobarquee

Pour l'effacement des données client
Je pense que tu as raison, je vais retirais la commande qui efface les données. Par contre je vais mettre un lien dans le panier et en commande finale au cas ou le client préfèrerais ne pas laisser ses données, libre choix en somme.

Au sujet d'effacer la 1ere commande avec la 2eme, je trouve ça normale, car si le client na pas commander la 1ere fois s'est que ça ne l'intéresse pas.

il faut que tu trouves une parade pour que chaque commande corresponde à un numéro unique.

La session, je vais voir pour la supprimer. (pas confiance)
Comme je commence à comprendre le système de "reprise de ID" je pourrais par exemple la reprendre à chaque commande.
Ca va me faire des scripts assez longs mais il ni aurat que du PHP et ça rejoindra la "parade" que tu dis (à moins que tu pensé autre chose)

Après je verrais pour que la commande soit envoyer directement dans la boite mail du client et un double pour le webmaster, ça éviteras l'impression de la commande et restera juste à envoyer le chèque.
Je sais faire ce genre de formulaire.

Merci pour ton aide

Cordialement
Gilledunord

25 Dernière modification par NooD (20-06-2009 18:55:50)

Re: [RESOLU]Problème d'identité panier

Deux choses importantes :
- la session doit stocker un idclient et non un nom puisque si deux clients ont le même nom tu risques d'avoir des problèmes...
- attention aux injections SQL, il faut contrôler les variables que tu utilises dans les requêtes! C'est bien joli de s'inquiéter à propos des sessions mais il faudrait d'abord commencer par faire un script php robuste.

La gestion de commande en ligne est une chose très sensible au niveau de la sécurité, il ne s'agit pas de créer un livre d'or. Tu devrais te tourner vers des scripts php développés par des personnes qui sont plus renseignées que toi à propos de la sécurité. Je te dis ça pour toi car si tes clients se rendent compte que ton site n'est pas fiable, tu auras une bien mauvaise pub.
Au fait, utilises-tu https ou tout se passe en http ?

>> SubTherMiX <<
>> alternux <<