Panier dans un cookie

Eléphanteau du PHP | 28 Messages

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;

}

?>

Mammouth du PHP | 2703 Messages

17 août 2017, 16:42

en gros, remplacer $_SESSION par $_COOKIE

Eléphanteau du PHP | 28 Messages

17 août 2017, 18:30

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

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
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 28 Messages

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.

Eléphanteau du PHP | 28 Messages

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.

Eléphant du PHP | 337 Messages

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

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 ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 28 Messages

22 août 2017, 00:02

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 août 2017, 11:16

Utilises les outils de développement de firefox et regarde au niveau des cookies ce qui est enregistré
Quand tout le reste a échoué, lisez le mode d'emploi...