Page 1 sur 1

Paniers

Posté : 14 mai 2006, 06:08
par Chile
bonjour,
J'ai l'intention de faire un site de vente avec le concept classique de paniers.
J'ai lu le tuto et les differentes discussions sur le forum, mais j'ai tout de meme besoin de votre aide :)
Voici mon idée :
Meme si le visiteur n'est pas client ou pas encore logé, il peut mettre des articles dans son panier et si il confirme son achat, il se log ou cree un compte.
Aussi j'ai crée l'architecture du site avec sur chaque page une session_start().
Est-ce la bonne demarche jusqu'a la ?

Donc j'ai une page "produit" ou figure un article, infos et un bouton "acheter" qui lui fait partie d'un mini formulaire avec des champs cachés id/client/article/quantité.
Mom p'tit probleme vient du fait que lorsque que j'active le bouton et donc envoie ce formulaire qui doit remplir ma table "panier"...eh il y a tout sauf le client :(
j'ai utilisé la variable MM_Username de session:
 <input name="client" type="hidden" id="client" value="<?php echo $SESSION['MM_Username']; ?>">

De plus, j'ai un formulaire de connection qui demande l'email + code des "clients". Est-ce que la variable MM_Username de session qui suit le client est sous forme d'email. Et sous quelle forme est-elle pour un visiteur non connecté ??
voila :)
merci pour votre aide et conseils

Posté : 14 mai 2006, 09:34
par Cyrano
Salut, tu peux simplifier en utilisant la session :
mon tuto sur les paniers ne comporte pour la variable de session que les éléments sur les articles, mais tu pourrais aussi bien avoir d'autres éléments comme par exemple les informations sur le client à qui sera facturée la commande, celles sur le client à qui sera expédiée la commande (qui peut être différent du précédent.)

Les valeurs enregistrées peuvent être "N/D" (Non disponible) tant que le visiteur n'est pas identifié : au moment de confirmer la commande, il devra obligatoirement s'identifier et tu pourras alors compléter les valeurs manquantes.

Grosso-modo, ta variable de session ressemblera alors à quelque chose dans ce style:
<?php
/* Création de la variable de session panier */
$_SESSION['panier'] = array(
    "session"=> session_id(),
    "articles" => array(
        "reference" => array(),
        "quantite" => array(),
        "prixunitaire" => array(),
    ),
    "clients" => array(
        "facturation" => array(
            "id" => "N/D",
            "nom" => "N/D",
            "prenom" => "N/D",
            "adresse" => "N/D",
            "codepostal" => "N/D",
            "ville" => "N/D",
        ),
        "livraison" => array(
            "nom" => "N/D",
            "prenom" => "N/D",
            "adresse" => "N/D",
            "codepostal" => "N/D",
            "ville" => "N/D",
        )
    )
);
//...
?>
C'est une version abrégée de ce que j'utilise moi-même : tu as là tous les éléments nécessaires pour faire fonctionner un panier que ton client soit identifié ou non : tu complètes au moment de l'identification et lorsque l'internaute complète le formulaire sur les informations de facturation/livraison.

Posté : 15 mai 2006, 10:35
par jojolapine
Simplement pour corriger une erreur, dans ton code, tu appel mal la variable session, il manque un _:
<input name="client" type="hidden" id="client" value="<?php echo $_SESSION['MM_Username']; ?>" />
c'est peut être ça qui allait pas

Posté : 15 mai 2006, 16:31
par Chile
ouiii :) merci Jojolapine, c'etait bien ca !

merci aussi Cyrano, pour les infos sur la variable cession,
J'ai compris "l'esprit de panier".
Par contre je bloque sur l'id d'un visiteur qui d'identifie et celui qui ne s'identifie pas...pendant le remplissage panier.
Dans le premier cas j'ai bien son mail dans ma base panier, mais dans le second cas, je ne vois pas comment faire !?

Posté : 15 mai 2006, 17:08
par guilt92
Il te suffit de tester si l'utilisateur est authentifié ou non avant d'envoyer le formulaire.

Tu testes l'existence de la variable avec un if() et si il n est pas identifié tu traites le cas dans un else en le renvoyant vers une autre page par exemple.

La fonction isset()pourra t etre utile pour savoir si ton visiteur est identifé ou non.

Posté : 15 mai 2006, 19:42
par Cyrano
Considère ton magasin en ligne comme un supermarché ou tu vas normalement faire tes courses : à l'entrée, tu prends un caddie que tu pousses vigoureusement de rayon en rayon pour le remplir au gré des besoins et/ou de tes fantaisies. Tant que tu n'arrives pas à la caisse, le personnel du magasin se fout de ton identité, n'a pas besoin de connaitre ni ton nom ni ton adresse ni même que tu existes. Par contre, au moment de passer à la caisse, il va falloir sortir ton chéquier (ou ta carte bleue mais l'exemple est plus parlant avec un chéquier) : tes articles seront comptabilisés, on t'annonce le total et tu rédiges le chèque: en clair, tu t'identifie pour que le comptable du magasin sache à quelle banque il va devoir se faire payer contre ce chèque.

Ton magasin en ligne fonctionne exactement de la même manière. Ce qui t'identifie de façon anonyme, c'est le panier. Tout comme dans le supermarché tu as ton caddie, les autres clients ont le leur, mais il n'y a pas de mélanges, c'est le contenant de ton passage dans les rayons, c'est l'équivalent de ta variable de session $_SESSION['panier'] : tu n'as pas besoin d'être identifié, PHP gère le numéro du cadie, c'est ton session_id() qui permet de distinguer un panier d'un autre quand plusieurs clients sont présents en même temps. Et à la caisse seulement, tu auras besoin d'être identifié de façon plus précise.

En conclusion, tu n'as besoin que d'un identifiant jusqu'à la caisse : le session_id(), rien d'autre. Ensuite, après ton identification à la caisse, il sera temps de récupérer ton identifiant de client dans la base de données pour ranger les articles dans le bon corridor d'expédition si je peux dire pour que ce soit bien à toi que les articles soient envoyés et non à un autre client quelconque.

Est-ce que cette illustration pratique éclaire mieux la situation ? :)

Posté : 10 juin 2006, 17:55
par Chile
Salut,
Merci Cyrano pour l'illustration. Je comprends mieux le concept du panier, et ce a quoi je dois parvenir. Par contre pour mettre ca en pratique sur ca va pas etre de la rigolade :)
Il va falloir que je retouche la struture de mon site car jusqu'a maintenant, je remplissait le panier avec la variable "$_SESSION['MM_Username']" du visiteur connecté. et reconnu sur chaque page avec <?php session_start(); ?>.

En plus vu que je ne suis pas doué, je me sers de Dreamweaver qui me code une grande partie de mes pages que je complete si besoin :?

Jusqu'a maintenant j'ai par exemple sur ma page panier:
-une requete sur une table "client" avec $_SESSION['MM_Username'] (au cas ou le visiteur est dekja client et qu'il se connecte)
-une requete sur table "produits", avec $_GET['id'], pour recuperer les infos du produit a mettre dans le panier.
-une requete avancé "panier", avec $_SESSION['MM_Username'] pour afficher le contenu du panier en cours de ce client.(avec channgement quantité)
-une requete "total", avec $_SESSION['MM_Username'], pour le total
- et une requete simple "panier_aff" , avec $_SESSION['MM_Username'] pour afficher en parmanence et sur chaque page le contenu du panier en cours.

Dois je remplacer ma session_start() par session_id() ? :?
J'ai bien compris que je dois seulement recolter les infos perso du visiteur a la commande et donc a la fin. Mais si celui-ci se connecte avant ! ou seront-elle conserver en attendant la commande et avec quelle variable ?
quelle variable vais-je utiliser pour remplir le panier ?
beaucoup de questions...car je suis perdu :cry:

voici mon code a tout hasard...
<?php require_once('connect.php'); ?>
<?php session_start(); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "panier")) {
  $updateSQL = sprintf("UPDATE shop_panier SET client=%s, quantite=%s WHERE id=%s AND article=%s",
                       GetSQLValueString($_POST['client'], "text"),
                       GetSQLValueString($_POST['quantite'], "int"),
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['article'], "int"));

  mysql_select_db($database_boutique, $boutique);
  $Result1 = mysql_query($updateSQL, $boutique) or die(mysql_error());

  $updateGoTo = "panier.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "validation")) {
  $insertSQL = sprintf("INSERT INTO shop_commande (client, `date`, total_ht, total_ttc) VALUES (%s, %s, %s, %s)",
                       GetSQLValueString($_POST['client'], "text"),
                       GetSQLValueString($_POST['date'], "date"),
                       GetSQLValueString($_POST['total_ht'], "int"),
                       GetSQLValueString($_POST['total_ttc'], "int"));

  mysql_select_db($database_boutique, $boutique);
  $Result1 = mysql_query($insertSQL, $boutique) or die(mysql_error());

  $insertGoTo = "traitement_panier.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

session_start(); ?>
<?php
$colname_enr_clients = "1";
if (isset($_SESSION['MM_Username'])) {
  $colname_enr_clients = (get_magic_quotes_gpc()) ? $_SESSION['MM_Username'] : addslashes($_SESSION['MM_Username']);
}
mysql_select_db($database_boutique, $boutique);
$query_enr_clients = sprintf("SELECT * FROM shop_clients WHERE mail = '%s'", $colname_enr_clients);
$enr_clients = mysql_query($query_enr_clients, $boutique) or die(mysql_error());
$row_enr_clients = mysql_fetch_assoc($enr_clients);
$totalRows_enr_clients = mysql_num_rows($enr_clients);

$colname_livre = "1";
if (isset($_GET['id'])) {
  $colname_livre = (get_magic_quotes_gpc()) ? $_GET['id'] : addslashes($_GET['id']);
}
mysql_select_db($database_boutique, $boutique);
$query_livre = sprintf("SELECT * FROM shop_produits WHERE id = %s", $colname_livre);
$livre = mysql_query($query_livre, $boutique) or die(mysql_error());
$row_livre = mysql_fetch_assoc($livre);
$totalRows_livre = mysql_num_rows($livre);

$paramclient_panier = "0";
if (isset($_SESSION['MM_Username'])) {
  $paramclient_panier = (get_magic_quotes_gpc()) ? $_SESSION['MM_Username'] : addslashes($_SESSION['MM_Username']);
}
mysql_select_db($database_boutique, $boutique);
$query_panier = sprintf("SELECT shop_panier.*, shop_produits.titre, shop_produits.photo1p, shop_produits.prix_ht, shop_produits.prix_ttc, (shop_produits.prix_ttc*shop_panier.quantite) AS total_ttc, (shop_produits.prix_ht*shop_panier.quantite) AS total_ht FROM shop_panier INNER JOIN shop_produits ON  shop_panier.article=shop_produits.id WHERE client = '%s'", $paramclient_panier);
$panier = mysql_query($query_panier, $boutique) or die(mysql_error());
$row_panier = mysql_fetch_assoc($panier);
$totalRows_panier = mysql_num_rows($panier);

$paramclient_total = "0";
if (isset($_SESSION['MM_Username'])) {
  $paramclient_total = (get_magic_quotes_gpc()) ? $_SESSION['MM_Username'] : addslashes($_SESSION['MM_Username']);
}
mysql_select_db($database_boutique, $boutique);
$query_total = sprintf("SELECT now() AS date, SUM(shop_panier.quantite*shop_produits.prix_ttc) AS total_ttc, SUM(shop_panier.quantite*shop_produits.prix_ht) AS total_ht FROM shop_panier INNER JOIN shop_produits ON  shop_produits.id=shop_panier.article WHERE client = '%s' GROUP BY shop_panier.client", $paramclient_total);
$total = mysql_query($query_total, $boutique) or die(mysql_error());
$row_total = mysql_fetch_assoc($total);
$totalRows_total = mysql_num_rows($total);

$colname_aff_panier = "1";
if (isset($_SESSION['MM_Username'])) {
  $colname_aff_panier = (get_magic_quotes_gpc()) ? $_SESSION['MM_Username'] : addslashes($_SESSION['MM_Username']);
}
mysql_select_db($database_boutique, $boutique);
$query_aff_panier = sprintf("SELECT * FROM shop_panier WHERE client = '%s'", $colname_aff_panier);
$aff_panier = mysql_query($query_aff_panier, $boutique) or die(mysql_error());
$row_aff_panier = mysql_fetch_assoc($aff_panier);
$totalRows_aff_panier = mysql_num_rows($aff_panier);
?>

Posté : 11 juin 2006, 11:24
par Cyrano
Je vais reprendre un élément ou deux:
Le session_start() reste indispensable et doit débuter chaque page: c'est obligatoire pour démarer une session (quand tu entres dans le magasin) ou prolonger une session existante (quand tu changes de rayon dans le magasin). Il ne faut surtout pas remplacer session_start() par session_id(), le résultat du second dépendant de l'existence du premier. Si tu supprimes le premier, le second génèrera une erreur. Pour illustrer :
- session_start() = Tu entres dans le magasin ou tu changes de rayon dans le magasin;
- session_id() = un numéro identifiant ton caddie de ceux des autres clients;
Partant de là, il est facile de comprendre que si tu ne rentres pas dans la magasin, tu ne pourras pas avoir de caddie.

Ensuite, si ton internaute s'identifie en arrivant, c'est comme si tu vas dans ton super-marché habituel, supermarché dont tu connais le comptable par exemple: tu rentres et tu vas lui dire bonjour en passant : mais en fin de compte, ça ne change rien. Il sait que tu es là et sait qui tu es, mais au niveau du panier, ça ne modifie rien à un petit détail près. Si tu reprends le modèle de variable de session que j'ai proposé plus haut, tu noteras que c'est un tableau qui contient plusieurs sous-tableaux : il y a parmi ces dernier l'un d'eux qui sert à stocker les informations sur l'internaute : s'il est identifié, les données seront présentes, s'il ne l'est pas, les données seront "N/D" jusqu'à la caisse. Mais au niveau des articles mis dans le panier, ça ne change rien, ce sont d'autres données indépendantes, même si elles se retrouvent toutes dans le tableau "panier"

Posté : 15 juin 2006, 04:51
par Chile
salut Cyrano,
Encore merci. ok j'ai compris ! mais je suis un peu perdu dans les modifs a apporter a mon code actuel :?

Alors, si j'ai bien compris je n'ai plus besoin de ma table panier !? (sur le seveur)

Lors de l'achat d'un objet, est-ce que je dois remplacer ma variable $_SESSION['MM_Username'] par "sessions" du tableau panier ?

Lors du traitement de confirmation de la commande (mon code est plus haut), la table de mon panier se vidait pour remplir une table commande (le total) et une autre commande_ligne (les details), comment puis je remplacer les references de la table panier dans ces codes, par les nouveaux tableaux de la session ? :?

Est-ce que tu pourrais me guider un peu sur les modifs a apporter a mon code ?? stp

voici mon formulaire du bouton "acheter" :
<form action="<?php echo $editFormAction; ?>" method="POST" name="achat" id="achat">
                      <input type="submit" name="Submit" value="acheter">                      
                      <input name="client" type="hidden" id="client" value="<?php echo $_SESSION['MM_Username']; ?>">
                      <input name="article" type="hidden" id="article" value="<?php echo $row_livre['id']; ?>">
                      <input name="quantite" type="hidden" id="quantite" value="1">
                      <input type="hidden" name="MM_insert" value="achat">
                    </form>
et la fonction:
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "achat")) {
  $insertSQL = sprintf("INSERT INTO shop_panier (client, article, quantite) VALUES (%s, %s, %s)",
                       GetSQLValueString($_POST['client'], "text"),
                       GetSQLValueString($_POST['article'], "int"),
                       GetSQLValueString($_POST['quantite'], "int"));

  mysql_select_db($database_boutique, $boutique);
  $Result1 = mysql_query($insertSQL, $boutique) or die(mysql_error());

  $insertGoTo = "panier.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}
 session_start(); ?>

Posté : 19 juin 2006, 16:22
par Chile
désolé, je remonte ma question car je suis bloqué... :?

Posté : 19 juin 2006, 19:40
par Cyrano
:arrow: tuto sur les paniers, tu y trouveras peut-être bien ta réponse...

Posté : 19 juin 2006, 20:25
par Chile
salut Cyrano,
je suis justement en train d'etudier ce tuto...depuis 2 jours !
Mais je ne comprends toujours pas comment adapter mon bouton achat. ce dernier est donc un formulaire qui va remplir cette fois ci le panier virtuel ?

Posté : 19 juin 2006, 22:48
par Cyrano
Pas nécessairement : ça peut être un lien qui pointe vers une page qui ne contient aucun affichage mais le code d'ajout (ou de retrait) dans le panier : l'url comportera des paramètres pour identifier l'article et une indication pour le retour une fois enregistré, donc la page en cours : dans cette page, il y aura récupération du paramètre de l'article à ajouter, l'appel à la fonction qui va ajouter l'article et une redirection qui ramène sur la page de l'article.