Page 1 sur 1

Panier dans un cookie

Posté : 17 août 2017, 15:06
par jems
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;

}

?>

Re: Panier dans un cookie

Posté : 17 août 2017, 16:42
par or 1
en gros, remplacer $_SESSION par $_COOKIE

Re: Panier dans un cookie

Posté : 17 août 2017, 18:30
par jems
je viens de le faire que dois-je faire d'autre ?

Re: Panier dans un cookie

Posté : 17 août 2017, 18:32
par @rthur
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

Posté : 17 août 2017, 18:37
par jems
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

Posté : 17 août 2017, 18:44
par jems
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

Posté : 18 août 2017, 13:09
par finipe
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

Posté : 18 août 2017, 13:25
par @rthur
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

Posté : 22 août 2017, 00:02
par jems
En effet c'est parfait mais ça semble pas fonctionner sur firefox

Re: Panier dans un cookie

Posté : 22 août 2017, 11:16
par @rthur
Utilises les outils de développement de firefox et regarde au niveau des cookies ce qui est enregistré