Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM PHP FAQ PHP COURS PHP SOURCES PHP LIVRES PHP SCRIPTS PHP OUTILS PHP COMPARATIFS PHP TV Zend Framework

Tutoriel sur la création d'un panier en PHP

Date de publication : 5/11/2007

Par Joris CROZIER
 

Cet article a pour but d'expliquer la création simple d'un panier en PHP.

Introduction
I. Procédure
II. Création du script de fonctions
II-1. Création du panier
II-2. Ajout d'un article
II-3. Suppression d'un article
II-4. Modifier un article
II-5. Montant du panier
III. Création du panier
III-1. Affichage du panier
III-2. Création des traitements
III-3. Script panier.php
III-4. Utilisation du panier
IV. Pour aller plus loin
V. Remerciements


Introduction

Cet article montre une méthode simple pour créer un panier en PHP. Cet article s'adresse aux programmeurs débutants désirant créer simplement un panier pour leur site .
Pour comprendre cet article il vous faut connaitre un minimum :

  • les bases de PHP
  • les tableaux en PHP
  • les sessions en PHP

I. Procédure

Pour créer notre panier nous allons procéder comme suit :

  • Un script fonctions-panier.php regroupera les diverses fonctions utiles au panier
  • Un script panier.php représentera le panier en lui même et la base des appels aux fonctions
idea Pour rendre le panier plus sympa à utiliser nous ajouterons quelques miettes de JavaScript !
Dans notre exemple les articles ont 3 propriétés :

  • Leur libellé
  • Leur quantité
  • Leur prix
Libre à vous d'en ajouter :-)


warning Il est recommandé d'utiliser une version de PHP 4.2.0 au minimum dû à l'utilisation de la fonction array_search()

II. Création du script de fonctions

Nous allons donc commencer par monter notre script de fonctions de notre panier : fonctions-panier.php


II-1. Création du panier

Avant toute chose il est important de placer la ligne session_start() au début de notre panier.php
(et si possible sur toutes les autres pages de votre site afin d'éviter de perdre votre panier et autres informations en route)

Nous allons donc ajouter notre fonction creationPanier() au script fonctions-panier.php:

fonctions-panier.php

function creationPanier(){
$ret=false;

if (isset( $_SESSION['panier']))
 $ret = true;
else
{

  $_SESSION['panier']=array();
  $_SESSION['panier']['libelleProduit'] = array();
  $_SESSION['panier']['qteProduit'] = array();      
  $_SESSION['panier']['prixProduit'] = array();
  $ret=true;
}
return $ret;
}

Quelques explications :

- Dans un premier temps on regarde si le panier existe, sinon on le crée
- La variable $ret me permet de savoir si tout se passe correctement, utile dans la suite des fonctions


II-2. Ajout d'un article

Nous allons ajouter notre fonction ajouterArticle() dans le script fonctions-panier.php
fonctions-panier.php

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

if (creationPanier())
{
$positionProduit = array_search($libelleProduit,  $_SESSION['panier']['libelleProduit']);
	
  if ($positionProduit !== false)
  {
   $_SESSION['panier']['qteProduit'][$positionProduit] += $qteProduit ;
  }
  else
  {
   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.";
}

Quelques explications :


  • On vérifie en premier que le panier existe via notre fonction précédente creationPanier()
  • On regarde si l'article existe déjà : si oui on augmente sa quantité dans le panier si non on l'ajoute

II-3. Suppression d'un article

Pour être en mesure de supprimer un article, il nous faut également une fonction, la voici :
fonctions-panier.php

function supprimerArticle($libelleProduit){

if (creationPanier())
{
  $tmp=array();
  $tmp['libelleProduit'] = array();
  $tmp['qteProduit'] = array();      
  $tmp['prixProduit'] = array();
      
  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.";
}
Quelques explications :


  • On vérifie en premier que le panier existe via notre fonction précédente creationPanier()
  • On crée un panier "tampon" qui va être notre panier sans les éléments à supprimer
  • On remplit ledit panier "tampon"
  • On réaffecte notre panier via les valeurs du panier tampon que l'on supprime par la suite

Cette méthode nous permet de garder un panier sans fioritures, nous aurions pu simplement supprimer les valeurs correspondantes dans le premier panier,
ce qui aurait eu pour effet de laisser des valeurs NULL dans le panier et l'aurait rendu peu pratique à l'utilisation !


II-4. Modifier un article

Enfin il nous manque une fonction qui peut ne pas être mise en place mais qui ajoute un grand confort à l'utilisation du panier,
à savoir la modification de la quantité d'un article, la voici :
fonctions-panier.php

function modifierQTeArticle($libelleProduit,$qteProduit){
if (creationPanier())
{

  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.";
}
Quelques explications :


  • On vérifie en premier que le panier existe via notre fonction précédente creationPanier()
  • Si la quantité demandée pour un produit est supérieure à 0 (et accessoirement celui ci existe mais il a peu de chance qu'on demande la modification d'un article qui n'existe pas ^^)
  • on la modifie
  • Si la quantité est négative ou nulle cela revient à dire que l'on supprime l'article !

II-5. Montant du panier

Evidement que serait notre panier s'il ne renvoyait pas le montant global des achats ?
fonctions-panier.php

function MontantGlobal(){

$total=0;

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

III. Création du panier

Nous allons donc créer un script que l'on appellera panier.php dans lequel on va afficher le panier mais aussi appeler les fonctions crées précédemment !



III-1. Affichage du panier

Dans un premier temps nous allons afficher le contenu du panier en traitant le cas où il serait vide :
C'est le code qui sera exécuté par défaut dans notre script panier.php, le traitement se fera toujours avant l'affichage du panier

panier.php

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

echo '<?xml version="1.0" encoding="iso-8859-1"?>';?>
<!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=\"QteArticle[]\" 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>
Quelques explications :


  • On créé un tableau HTML pour la présentation de notre panier
  • S'il est vide on le spécifie
  • Sinon on affiche les lignes de notre panier
La petite spécificité de notre exemple c'est que j'ai mis en place un formulaire pour gérer le changement de quantité d'un article !



III-2. Création des traitements

Dans notre exemple nous allons traiter les diverses actions via une variable $action passée en GET (compréhension du tutoriel),
Il sera plus judicieux par la suite (quand vous coderez votre panier), de procéder par variable POST suivant vos besoins !

Notre variable débouchera donc sur un Switch qui appellera nos fonctions crées précédemment !
Tout ceci AVANT l'affichage du panier !
panier.php

if (isset($_GET['action']))
{
 $erreur=false;


 if(in_array( $_GET['action'],array('ajout', 'suppression', 'refresh')))
  $action = $_GET['action'];
 else
  $erreur=true;

 $l = preg_replace('#\v#', '', $_GET['l']);
	
 $q = intval($_GET['q']);

 $p = floatval($_GET['p']);

}

elseif(isset($_POST['action']))
{
 unset($_GET);
 $erreur=false;
	
 if(in_array($_POST['action'],array('ajout', 'suppression', 'refresh')))
  $action=$_POST['action'];
 else
  $erreur=true;
	
  $l = preg_replace('#\v#', '',$_POST['l']);
	
  $p = floatval($_POST['p']);
	
	
 $QteArticle = array();
	
 $i=0;
 foreach ($_POST['QteArticle'] as $contenu){
  $QteArticle[$i++] = intval($contenu);
	
 }
	
}




if ($erreur==false){

 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;
      
 }
}
warning Un grand soin est apporté à la vérification des variables transmises au panier pour éviter les injections de code ou les failles xss.
L'utilisation du pattern '\v' nécéssite une version de PHP 5.2.4, elle permet de supprimer les espaces verticaux superflus.
Plus d'infos sur le pattern utilisé.


III-3. Script panier.php

Notre script panier.php ressemble donc à ceci :

panier.php

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

if (isset($_GET['action']))
{
$erreur=false;
 if(in_array( $_GET['action'],array('ajout', 'suppression', 'refresh')))
  $action = $_GET['action'];
 else
  $erreur=true;

 $l = preg_replace('#\v#', '', $_GET['l']);
	
 $q = intval($_GET['q']);

 $p = floatval($_GET['p']);

}

elseif(isset($_POST['action']))
{
 unset($_GET);
 $erreur=false;
	
 if(in_array($_POST['action'],array('ajout', 'suppression', 'refresh')))
  $action=$_POST['action'];
 else
  $erreur=true;
	
  $l = preg_replace('#\v#', '',$_POST['l']);
	
  $p = floatval($_POST['p']);
	
	
 $QteArticle = array();
	
 $i=0;
 foreach ($_POST['QteArticle'] as $contenu){
  $QteArticle[$i++] = intval($contenu);
	
 }
	
}




if ($erreur==false){

 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="iso-8859-1"?>';?>
<!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=\"QteArticle[]\" 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(