Panier dans un cookie

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Panier dans un cookie

Re: Panier dans un cookie

par @rthur » 22 août 2017, 11:16

Utilises les outils de développement de firefox et regarde au niveau des cookies ce qui est enregistré

Re: Panier dans un cookie

par jems » 22 août 2017, 00:02

En effet c'est parfait mais ça semble pas fonctionner sur firefox

Re: Panier dans un cookie

par @rthur » 18 août 2017, 13:25

Le panier se transmet sur la page mais il n'est pas conservé quand je relance le navigateur.
Si ton objectif de passer en cookie plutôt qu'en session est juste de conserver le panier après une fermeture/réouverture du navigateur, alors tu peux conserver les sessions mais il suffit juste de demander à PHP de créer un cookie de session persistant.

Voici ce qu'il faut ajouter après chaque appel à session_start() :
session_start();
setcookie(session_name(),session_id(),time()+3600);
Ici j'ai indiqué 3600 secondes soit 1 heure, donc le panier expirera 1 heure après la fermeture du navigateur, tu peux bien sûr augmenter cette valeur.

Je rejoints également ce que t'a indiqué finipe, si tu veux un panier vraiment persistant (comme ce que fait Amazon par exemple) et qui puisse être retrouvé même depuis un autre ordinateur du moment que l'utilisateur s'identifie, alors il faut faire un enregistrement en bdd, mais c'est + complexe à mettre en oeuvre que de juste allonger la durée d'un cookie de session ;)

Re: Panier dans un cookie

par finipe » 18 août 2017, 13:09

La solution la plus "sûre" serait d'inscrire ton panier dans une base de données. Là tu es certain qu'il est bien stocké quelque part.
Après ça dépend si l'utilisateur doit ou non s'enregistrer pour effectuer une commande. Si ce n'est pas le cas, il n'y a pas vraiment de moyen de récupérer une commande non terminée.

Re: Panier dans un cookie

par jems » 17 août 2017, 18:44

si je fait comme ça :

setcookie('panier','', (time() + 3600));

Le panier se transmet sur la page mais il n'est pas conservé quand je relance le navigateur.

Re: Panier dans un cookie

par jems » 17 août 2017, 18:37

setcookie('panier',$_COOKIE['panier'], (time() + 3600));

Voilà ou j'en suis après avoir remplacé toute les variables session par cookie évidemment celà me dit que panier ne fonctionne pas.

Re: Panier dans un cookie

par @rthur » 17 août 2017, 18:32

je viens de le faire que dois-je faire d'autre ?
Faire un peu de debugage par toi même, et regarder ce qui marche et ce qui ne marche pas afin qu'on puisse t'aider + efficacement sur ce qui ne fonctionne pas ;)

A noter tout de même que ce que tu souhaites faire n'est pas courant. En général, il est préférable de mettre le panier en session (et d'avoir un cookie de session), plutôt que de tout mettre dans des cookies sur lesquels tu n'est pas à l'abri d'une suppression par le navigateur ou par un outil tiers style antivirus/antipub/antimalware/logiciel de nettoyage du disque

Re: Panier dans un cookie

par jems » 17 août 2017, 18:30

je viens de le faire que dois-je faire d'autre ?

Re: Panier dans un cookie

par or 1 » 17 août 2017, 16:42

en gros, remplacer $_SESSION par $_COOKIE

Panier dans un cookie

par jems » 17 août 2017, 15:06

Bonjour, voilà j'ai un panier qui fonctionner bien mais je voudrais le mettre dans un cookie hors je ne sait comment faire.

Mon panier est composé de 3 pages ( catalogue.php/panier.php/fonctions.panier.php).


Voici catalogue.php

(Sans structure html pour le moment)

<p>Produit A - 9 €</p>
<a href="panier.php?action=ajout&amp;l=Produit A&amp;q=1&amp;p=9" ;>Ajouter au panier</a>
<br/><br/>
<p>Produit B - 19 €</p>
<a href="panier.php?action=ajout&amp;l=Produit B&amp;q=1&amp;p=19"; >Ajouter au panier</a>
<br/><br/>
<p>Produit C - 79 €</p>
<a href="panier.php?action=ajout&amp;l=Produit C&amp;q=1&amp;p=79"; >Ajouter au panier</a>
<br/><br/>
<p>Produit D - 5 €</p>
<a href="panier.php?action=ajout&amp;l=Produit D&amp;q=1&amp;p=5" ;>Ajouter au panier</a>
<br/><br/>
<p>Produit E - 45 €</p>
<a href="panier.php?action=ajout&amp;l=Produit E&amp;q=1&amp;p=45"; >Ajouter au panier</a>
<br/><br/>
<p>Produit F - 29 €</p>
<a href="panier.php?action=ajout&amp;l=Produit F&amp;q=1&amp;p=29"; >Ajouter au panier</a>
<br/><br/>
<p>Produit G - 10 €</p>
<a href="panier.php?action=ajout&amp;l=Produit G&amp;q=1&amp;p=10" ;>Ajouter au panier</a>








Voici panier.php



<?php
session_start();
include_once("fonctions-panier.php");

$erreur = false;

$action = (isset($_POST['action'])? $_POST['action']:  (isset($_GET['action'])? $_GET['action']:null )) ;
if($action !== null)
{
   if(!in_array($action,array('ajout', 'suppression', 'refresh')))
   $erreur=true;

   //récuperation des variables en POST ou GET
   $l = (isset($_POST['l'])? $_POST['l']:  (isset($_GET['l'])? $_GET['l']:null )) ;
   $p = (isset($_POST['p'])? $_POST['p']:  (isset($_GET['p'])? $_GET['p']:null )) ;
   $q = (isset($_POST['q'])? $_POST['q']:  (isset($_GET['q'])? $_GET['q']:null )) ;

   //Suppression des espaces verticaux
   $l = preg_replace('#\v#', '',$l);
   //On verifie que $p soit un float
   $p = floatval($p);

   //On traite $q qui peut etre un entier simple ou un tableau d'entier
    
   if (is_array($q)){
      $QteArticle = array();
      $i=0;
      foreach ($q as $contenu){
         $QteArticle[$i++] = intval($contenu);
      }
   }
   else
   $q = intval($q);
    
}

if (!$erreur){
   switch($action){
      Case "ajout":
         ajouterArticle($l,$q,$p);
         break;

      Case "suppression":
         supprimerArticle($l);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($QteArticle) ; $i++)
         {
            modifierQTeArticle($_SESSION['panier']['libelleProduit'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }
}

echo '<?xml version="1.0" encoding="utf-8"?>';?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Votre panier</title>
</head>
<body>

<form method="post" action="panier.php">
<table style="width: 400px">
	<tr>
		<td colspan="4">Votre panier</td>
	</tr>
	<tr>
		<td>Libellé</td>
		<td>Quantité</td>
		<td>Prix Unitaire</td>
		<td>Action</td>
	</tr>


	<?php
	if (creationPanier())
	{
	   $nbArticles=count($_SESSION['panier']['libelleProduit']);
	   if ($nbArticles <= 0)
	   echo "<tr><td>Votre panier est vide </ td></tr>";
	   else
	   {
	      for ($i=0 ;$i < $nbArticles ; $i++)
	      {
	         echo "<tr>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['libelleProduit'][$i])."</ td>";
	         echo "<td><input type=\"text\" size=\"4\" name=\"q[]\" value=\"".htmlspecialchars($_SESSION['panier']['qteProduit'][$i])."\"/></td>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['prixProduit'][$i]) . " €</td>";
	         echo "<td><a href=\"".htmlspecialchars("panier.php?action=suppression&l=".rawurlencode($_SESSION['panier']['libelleProduit'][$i]))."\">XX</a></td>";
	         echo "</tr>";
	      }

	      echo "<tr><td colspan=\"2\"> </td>";
	      echo "<td colspan=\"2\">";
	      echo "Total : ".MontantGlobal();
	      echo "€</td></tr>";

	      echo "<tr><td colspan=\"4\">";
	      echo "<input type=\"submit\" value=\"Rafraichir\"/>";
	      echo "<input type=\"hidden\" name=\"action\" value=\"refresh\"/>";

	      echo "</td></tr>";
	   }
	}
	?>
</table>
</form>
</body>
</html>





Et voici fonctions-panier.php

<?php


function creationPanier(){
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['libelleProduit'] = array();
      $_SESSION['panier']['qteProduit'] = array();
      $_SESSION['panier']['prixProduit'] = array();
      $_SESSION['panier']['verrou'] = false;
   }
   return true;
}


function ajouterArticle($libelleProduit,$qteProduit,$prixProduit){


   if (creationPanier() && !isVerrouille())
   {
     
      $positionProduit = array_search($libelleProduit,  $_SESSION['panier']['libelleProduit']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['qteProduit'][$positionProduit] += $qteProduit ;
      }
      else
      {
         //Sinon on ajoute le produit
         array_push( $_SESSION['panier']['libelleProduit'],$libelleProduit);
         array_push( $_SESSION['panier']['qteProduit'],$qteProduit);
         array_push( $_SESSION['panier']['prixProduit'],$prixProduit);
      }
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}



function modifierQTeArticle($libelleProduit,$qteProduit){

   if (creationPanier() && !isVerrouille())
   {
     
      if ($qteProduit > 0)
      {
         
         $positionProduit = array_search($libelleProduit,  $_SESSION['panier']['libelleProduit']);

         if ($positionProduit !== false)
         {
            $_SESSION['panier']['qteProduit'][$positionProduit] = $qteProduit ;
         }
      }
      else
      supprimerArticle($libelleProduit);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

function supprimerArticle($libelleProduit){
   
   if (creationPanier() && !isVerrouille())
   {
     
      $tmp=array();
      $tmp['libelleProduit'] = array();
      $tmp['qteProduit'] = array();
      $tmp['prixProduit'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++)
      {
         if ($_SESSION['panier']['libelleProduit'][$i] !== $libelleProduit)
         {
            array_push( $tmp['libelleProduit'],$_SESSION['panier']['libelleProduit'][$i]);
            array_push( $tmp['qteProduit'],$_SESSION['panier']['qteProduit'][$i]);
            array_push( $tmp['prixProduit'],$_SESSION['panier']['prixProduit'][$i]);
         }

      }

      $_SESSION['panier'] =  $tmp;

      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++)
   {
      $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i];
   }
   return $total;
}



function supprimePanier(){
   unset($_SESSION['panier']);
}


function isVerrouille(){
   if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou'])
   return true;
   else
   return false;
}


function compterArticles()
{
   if (isset($_SESSION['panier']))
   return count($_SESSION['panier']['libelleProduit']);
   else
   return 0;

}

?>