Voici un exemple simple et dumment commenté:
<?php
//*************************************************************************************************************
// Programme d'affichage d'un panier de commande
//
// Objectifs :
// 1. Obtenir la source du panier (ensembles d'articles commandés)
// 2. Traiter l'Ajout, la modification des quantités et la suppression d'articles
// 3. Afficher son contenu dans une table HTML sous forme d'une facture. Pour ça il faut faire des calculs :
// 3.1. Calculer pour chaque article sa valeur = prix unitaire (pu) * quantité commandée (qté)
// 3.2. Calculer le total hors taxe (tht) = somme des valeurs des articles
// 3.3. Calculer le montant de la TVA (taux = 19%) = total hors taxe * 19/100
// 3.4. Calculer le montant TTC (ttc) = total hors taxe (tht) + montant de la TVA (tva)
//
//**************************************************************************************************************
//Source du panier
//Le panier est un tableau (array) composé de plusieurs lignes qui sont elles mêmes composées de colonnes (array)
//Une ligne article dans le panier est un tableau (array) composé des colonnes suivantes :
// * réf: est la référence de l'article commandé (c'est un index unique qui désigne un et un seul article)
// * désignation: est le nom de l'article commandé
// * pu: est le prix unitaire de l'article
// * qte: est la quantité commandée
//
// Comme exemple, le panier suivant contient 3 articles commandés par un client :
$panier_initial = array (
"1"=> array ("réf"=>1, "désignation"=>"Ecran LCD 19''", "pu"=>199.99, "qté"=>1),
"2"=> array ("réf"=>2, "désignation"=>"Disque dur 160 Go", "pu"=>100.00, "qté"=>1),
"3"=> array ("réf"=>3, "désignation"=>"Clé USB 1 Go", "pu"=>10.00, "qté"=>1)
);
//Les numéros de lignes du panier "1", "2" et "3" sont les réf des articles,
//celà permet de retrouver rapidement une ligne d'article pour la modifier ou la supprimer,
//celà permet aussi d'éviter l'ajout d'un article qui existe déjà
//
//Le panier doit être mémorisé dans une session pour assurer son évolution,
//activer la mémoire de session
session_start();
//Dans cet exemple, on initialise le panier s'il est absent de la session et on le retire de la session pour recommencer l'exemple
if ($_GET["action"]=="Recommencer") unset($_SESSION["panier"]);
//Initialiser la variable de session "panier" (juste pour cet exemple simple pour ne pas avoir besoin
//d'un catalogue de choix)
if ( ! isset($_SESSION["panier"]) ) $_SESSION["panier"] = $panier_initial;
//ATTENTION: Les 2 dernières lignes de code ainsi que le tableau $panier_initial ne font pas partie de la gestion réelle du panier,
//elles servent simplement pour faire tourner cette démo, il faut les retirer lors de l'integration du script à la phase finale
//Créer la variable de session $panier à partir de la mémoire de session
$panier = $_SESSION["panier"]; //quand ce programme bouclera, cette variable contiendra les données évolutives du panier
//Le panier sera traité par des action de type Ajout, Modification et suppression
//
//L'ajout: action provenant de la page catalogue d'article
if ($_GET["action"] == "Ajout") {
$réf = $_GET["réf"];
$désignation = $_GET["désignation"];
$pu = $_GET["pu"];
$qté = $_GET["qté"] + $panier["$ref"]["qté"]; //permet d'ajouter la nouvelle qté si l'article existe déjà
$panier ["$réf"] = array( "réf"=>$réf, "désignation"=>$désignation, "pu"=>$pu, "qté"=>$qté );
}
//Modification de la qté
if ($_GET["action"] == "Modifier") {
$réf = $_GET["réf"];
$qté = $_GET["qté"];
$panier ["$réf"]["qté"] = $qté; //réf est l'index et $qté est la valeur modifiée
}
//Suppression
if ($_GET["action"] == "Supprimer") {
$réf = $_GET["réf"];
unset( $panier ["$réf"] ); //$réf est l'index de l'article à supprimer
}
//Après le traitement, mettre à jour la session
$_SESSION["panier"] = $panier;
//Affichage du panier sous forme de facture
echo "<h1>Votre panier</h1>";
if (count($panier)>0){
//Début du panier
//Affichage de l'entête du tableau
echo "<table border='1'>
<tr>
<th>Désignation</th>
<th>Prix</th>
<th>Quantité</th>
<th>Valeur</th>
</tr>";
//Affichage des lignes du panier
//tht: Total hors taxe = somme des valeurs des articles du panier
$tht = 0;
foreach ($panier as $ligne) {
//Afficher une ligne du panier
//Chaque ligne est un formulaire qui permet de la modifier
//La réf de l'article est cachée
//La désignation et le pu sont en lecture seule (affichés)
//La qté est modifiable (zone de texte)
echo "
<form>
<input type='hidden' name='réf' value='$ligne[réf]'>
<tr>
<td>$ligne[désignation]</td>
<td align='right'>".number_format($ligne["pu"],2,"."," ")."</td>
<td><input type='text' name='qté' value='$ligne[qté]' style='text-align:right'></td>
<td align='right'>".number_format($ligne["pu"]*$ligne["qté"], 2, ".", " ")."</td>
<td><input type='submit' name='action' value='Modifier'>
<td><input type='submit' name='action' value='Supprimer'>
</tr>
</form>";
//Calcul de la somme des valeurs ( tht )
$tht += $ligne["pu"]*$ligne["qté"];
}
//Calcul de la TVA et du TTC
$tva = $tht * 0.19;
$ttc = $tht + $tva;
//Affichage du pied du tableau
echo "<tr>
<th colspan=3 align='right'>Total HT</th> <th align='right'>".number_format($tht,2,"."," ")."</th>
</tr>
<tr>
<th colspan=3 align='right'>Tva (19%)</th> <th align='right'>".number_format($tva,2,"."," ")."</th>
</tr>
<tr>
<th colspan=3 align='right'>TTC</th> <th align='right'>".number_format($ttc,2,"."," ")." €</th>
</tr>
</table>";
//Fin du panier
}
else echo "<p><font color=red>Panier vide!</font></p>
<p><b><i>Si vous voulez recommencer cet exemple, cliquez <a href='?action=Recommencer'>ici</a></i></b></p>";
?>
Remarque:
Il faut bien comprendre l'écriture suivante:
$panier["$réf"] et $panier["$réf"]["réf"]
Même si les deux indexes portent le même nom "réf", pour PHP ce n'est pas la même chose car le premier index ["$réf"] (où le mot "réf" est préfixé du $) désigne une variable qui a son évaluation donnera une valeur qui sera utilisée comme index.
Exemple:
si la variable $réf = 1
alors $panier["$réf"] = $panier["1"]
De ce fait, $panier["$ref"] désigne la ligne n°1 du tableau panier
De même $panier["$réf"]["réf"] sera $panier["1"]["réf"] si $réf=1 et désignera le champ "réf" de la ligne n°1 du tableau panier.
Cette technique d'indexation d'un tableau par la clé primaire d'une table de base de données est une bonne astuce pour simplifier les opérations nécessitant des accès directs dans le tableau, telque la recherche, l'ajout, la modif et la suppression.