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
 |
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 :-)
 |
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;
}
}
|
 |
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.
|
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
|