Bonjour, comme j'ai l'habitude d'aider par l'exemple, je continue jusqu'au bout et je vous présente l'exemple suivant d'un panier d'achat de sachets colorés dont le prix est fixé selon la quantité achetée.
Fichier principal : catalogue.php
<style>
.info { display:block; }
.catalogue { display:block; width:100%; }
.produit { display:inline-block; text-align:center; border-radius:5px; border:solid black 1px; margin:2px;}
</style>
<!-- debut ruban d'information -->
<div class="info">
<h1>Prix</h1>
<ul>
<li>1 sachet = 4,99 euros</li>
<li>2 sachets = 9,98 euros</li>
<li>3 sachets = promo 15,00 12,00 euros</li>
<li>Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros</li>
</ul>
</div>
<!-- fin ruban d'information -->
<!-- debut panier -->
<div class="panier"><?php include('panier.php');?></div>
<!-- fin panier -->
<!-- debut catalogue -->
<div class="catalogue"><h1>Catalogue</h1>
<?php
# afficher la liste des produits du catalogue
# données visibles : Photo -- Designation
# données cachées : id_produit
# action : acheter (envoi l'id_produit au panier.php)
# constantes
define('DOSSIER_IMG', 'images/');
# obtenir les données à partir de la base catalogue
# 1. se connecter à mySQL et à la base
$connexion = @mysql_connect('localhost','root','') or die (mysql_errno().' : '.mysql_error());
@mysql_select_db('ecommerce_2', $connexion) or die (mysql_errno().' : '.mysql_error());
# 2. exécuter la requête
$sql = 'select * from catalogue';
$curseur = @mysql_query($sql, $connexion);
while(is_resource($curseur) && ($row=@mysql_fetch_assoc($curseur)))
{
#
$id_produit = $row['id'];
$designation = $row['designation'];
$photo = DOSSIER_IMG.$row['photo'];
# creation du fichier de la photo si n'existe pas
if (!file_exists($photo)) {
# si la copie du modele "Image_Vide.jpg" n'a pas reussi, il faut creer une image vide
if (!file_exists(DOSSIER_IMG.'Image_Vide.jpg') || !copy(DOSSIER_IMG.'Image_Vide.jpg', $photo)) {creerImageVide($photo);}
}
?>
<!-- modèle d'affichage d'un produit -->
<div class="produit">
<form class="formAchat" name="formAchat" method="get" action="">
<h2 class="designation"><?php echo isset($designation)?$designation:null;?></h2>
<img class="photo" src="<?php echo isset($photo)?$photo:null;?>" />
<input type="hidden" name="id_produit" value="<?php echo isset($id_produit)?$id_produit:null;?>" />
<input type="hidden" name="designation" value="<?php echo isset($designation)?$designation:null;?>" />
<input type="hidden" name="photo" value="<?php echo isset($photo)?$photo:null;?>" />
<p><input type="submit" class="commande" name="acheter" value="Acheter" /></p>
</form>
</div>
<!-- fin modèle d'affichage d'un produit -->
<?php
} # fin de la boucle WHILE
# 3. fermer la connexion
@mysql_close($connexion);
?>
</div>
<!-- fin catalogue -->
<?php
#fonction de creation d'une image
function creerImageVide($nomFichier)
{
// Création de l'image
$largeur = 138;
$hauteur = 152;
$im= imagecreatetruecolor($largeur, $hauteur);
// Couleurs
$couleurFond = imagecolorallocate($im,255,0,0); // rouge
$couleurTexte = imagecolorallocate($im,255,255,255 ); // blanc
// Création d'un rectangle
imagefilledrectangle($im, 5, 5,$largeur-5,$hauteur-5,$couleurFond);
// Création d'une image vide et ajout d'un texte
$texte = "Pas d'image";
$taille_police = 6;
$posX_centreH = centrerH_texte($texte,$taille_police,$largeur);
$posY_centreV = centrerV_texte($texte,$taille_police,$hauteur);
imagestring($im,$taille_police,$posX_centreH,$posY_centreV,$texte,$couleurTexte);
// Sauvegarde de l'image sous le nom $nomFichier
imagejpeg($im, $nomFichier);
// Libération de la mémoire
imagedestroy($im);
}
// Fonctions pour déterminer le centrage horizontal de texte dans un cadre
function centrerH_texte($texte,$taille_police,$largeur_cadre)
{
// nombre de caractères dans le texte
$a = strlen($texte);
// taille d'un caractère par rapport à la taille de la police
$b = imagefontwidth($taille_police);
// taille en pixel du texte
$c = $a*$b;
// position centre horizontal
return ($largeur_cadre-$c)/2;
}
// Fonctions pour déterminer le centrage vertical de texte dans un cadre
function centrerV_texte($texte,$taille_police,$hauteur_cadre)
{
// hauteur du texte
$hauteur_police = imagefontheight($taille_police);
// position centre vertical
return ($hauteur_cadre/2)-($hauteur_police/2);
}
?>
Fichier Panier.php
<style>
.panier { display:block; text-align:center; float:right; border-radius:5px; border:solid black 1px; margin:2px;}
.panier img { width:60px; }
.panier .designation { font-size:0.7em; }
.commande { }
</style>
<center><button onclick="if (document.getElementById('panier').style.display=='none'){document.getElementById('panier').style.display='block';this.innerHTML='Fermer';} else {document.getElementById('panier').style.display='none';this.innerHTML='Afficher panier';}">Fermer</button></center>
<div id="panier"><h1>Votre panier</h1>
<?php
# afficher la liste des produits du panier
# données visibles : Photo -- Designation -- Prix -- Qté -- Total
# données cachées : id_produit
# actions : acheter, modifier la qté, supprimer un produit, valider le panier ou revenir au catalogue
# Démarrer la session
session_start();
#echo '<pre>'; print_r($_SESSION); echo '</pre>';
# la variable de session est : $_SESSION['panier']['contenu']=array('produit','qte','prix') dont: produit=array('id','designation','photo')
# sachant que le produit est unique dans le panier, donc le panier est indexé par id_produit : $_SESSION['panier']['contenu'][$id_produit]
##########################################
# Règles determinant le prix par Qtés
##########################################
/*
1 sachet = 4,99 euros
2 sachets = 9,98 euros
3 sachets = promo 15,00 12,00 euros
Au delà de 3 sachets, le sachet supplémentaire est à 4,00 euros
*/
function getPrix($qte)
{
if ($qte <1) return 0;
elseif ($qte ==1) return 4.99;
elseif ($qte ==2) return 9.98;
elseif ($qte ==3) return 12.00; #promo
elseif ($qte >3) return 4.00*($qte-3)+getPrix(3); #pour qte suppl.
}
##############################
# TRAITEMENT DU PANIER
##############################
# initialiser total panier
if (!isset($_SESSION['panier']['total'])) { $_SESSION['panier']['total'] = 0; }
# Action = Acheter
if (isset($_GET['acheter']) && isset($_GET['id_produit'])){
# variables de travail
$id_produit = $_GET['id_produit'];
$designation = $_GET['designation'];
$photo = $_GET['photo'];
# affectation du produit
if (!isset($_SESSION['panier']['contenu'][$id_produit])){
# nouveau produit
$_SESSION['panier']['contenu'][$id_produit] = array(
'qte' => 1,
'id_produit' => $id_produit,
'designation' => $designation,
'prix' => getPrix(1),
'photo' => $photo
);
# produit nouveau => mettre à jour total panier par prix
$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
}
else {
# produit existe => incrémentation de la qté
$_SESSION['panier']['contenu'][$id_produit]['qte']++;
# produit existe => mettre à jour total panier par prix
$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
$_SESSION['panier']['contenu'][$id_produit]['prix'] = getPrix($_SESSION['panier']['contenu'][$id_produit]['qte']);
$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
}
}
# Action = Modifier
if (isset($_GET['modifier']) && isset($_GET['id_produit'])&& isset($_SESSION['panier']['contenu'][$_GET['id_produit']])){
# variables de travail
$id_produit = $_GET['id_produit'];
$qte = $_GET['qte'];
# modifier la qté
$_SESSION['panier']['contenu'][$id_produit]['qte'] = $qte;
# produit existe => mettre à jour total panier par prix
$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
$_SESSION['panier']['contenu'][$id_produit]['prix'] = getPrix($qte);
$_SESSION['panier']['total'] += $_SESSION['panier']['contenu'][$id_produit]['prix'];
}
# Action = Supprimer
if (isset($_GET['supprimer']) && isset($_GET['id_produit']) && isset($_SESSION['panier']['contenu'][$_GET['id_produit']])){
# variables de travail
$id_produit = $_GET['id_produit'];
# produit existe => mettre à jour total panier par prix
$_SESSION['panier']['total'] -= $_SESSION['panier']['contenu'][$id_produit]['prix'];
# supprimer le produit
unset($_SESSION['panier']['contenu'][$id_produit]);
}
# Action = Supprimer Panier
if (isset($_GET['supprimerPanier']) && isset($_SESSION['panier'])){
unset($_SESSION['panier']);
# rediriger vers le catalogue
header('Location: catalogue.php');
exit();
}
# Action = Valider : enregistrer le panier dans la base
if (isset($_GET['valider']) && isset($_SESSION['panier']) && count($_SESSION['panier']['contenu'])>0 && isset($_GET['email'])){
# se connecter à mySQL et à la base
$connexion = @mysql_connect('localhost','root','') or die (mysql_errno().' : '.mysql_error());
@mysql_select_db('ecommerce_2', $connexion) or die (mysql_errno().' : '.mysql_error());
# enregistrer commande
$id_commande = date('Y-m-d-H-i-s').'-'.$_GET['email'];
$sql = "INSERT INTO commande(id_commande,date_commande,email,total) VALUES ('$id_commande','".date('Y-m-d H:i:s')."','".$_GET['email']."',".$_SESSION['panier']['total'].")";
@mysql_query($sql, $connexion);
#
foreach($_SESSION['panier']['contenu'] as $id_produit=>$contenu) # pour chaque ligne du panier
{
# variables de travail
$id_produit = $contenu['id_produit'];
$qte = $contenu['qte'];
$prix = $contenu['prix'];
# 2. exécuter la requête
$sql = "INSERT INTO panier(id_commande,id_produit,qte,prix) VALUES ('$id_commande','$id_produit','$qte','$prix')";
@mysql_query($sql, $connexion);
}
# 3. fermer la connexion
@mysql_close($connexion);
# envoyer un mail de confirmation au client : voir la fonction mail()
# ecrire une trace
$contenu_existant = file_get_contents('journal.txt');
file_put_contents('journal.txt', $contenu_existant.'Date commande:'.date('Y-m-d').'; Email:'.$_GET['email'].'; Id Commande:'.$id_commande.'; Montant:'.$_SESSION['panier']['total']." euros.\n");
#vider le panier
unset($_SESSION['panier']);
# rediriger vers le catalogue
header('Location: catalogue.php');
exit();
}
# Affichage du panier
if (isset($_SESSION['panier']['contenu']) && is_array($_SESSION['panier']['contenu']) && count($_SESSION['panier']['contenu'])>0){
$total = $_SESSION['panier']['total'];
foreach($_SESSION['panier']['contenu'] as $id_produit=>$contenu) # pour chaque ligne du panier
{
# definir la variable qte pour le formulaire modif
$id_produit = $contenu['id_produit'];
$designation = $contenu['designation'];
$photo = $contenu['photo'];
$qte = $contenu['qte'];
$prix = $contenu['prix'];
?>
<!-- modèle d'affichage d'un produit -->
<div class="produit">
<form class="formAchat" name="formAchat" method="get" action="">
<h2 class="designation"><?php echo isset($designation)?$designation:null;?></h2>
<img class="photo" src="<?php echo isset($photo)?$photo:null;?>" />
<p>Qté : <input type="text" name="qte" value="<?php echo isset($qte)?$qte:0;?>" /></p>
<p>Prix : <span class="prix"><?php echo isset($prix)?number_format($prix,2,',',' ').' €':null;?></span></p>
<input type="hidden" name="id_produit" value="<?php echo isset($id_produit)?$id_produit:null;?>" />
<p><input type="submit" class="commande" name="modifier" value="Modifier" />
<input type="submit" class="commande" name="supprimer" value="Supprimer" /></p>
</form>
</div>
<!-- fin modèle d'affichage d'un produit -->
<?php
} # fin de la boucle FOREACH $_SESSION['panier']['contenu']
?>
<form class="formAchat" name="formAchat" method="get" action="">
<p>Total : <span class="prix"><?php echo isset($total)?number_format($total,2,',',' ').' €':null;?></span></p>
<p>Votre Email : <input type="text" name="email" value="<?php echo isset($_GET['email'])?$_GET['email']:null;?>" /></p>
<p><input type="submit" class="commande" name="valider" value="Valider votre panier" />
<input type="submit" class="commande" name="supprimerPanier" value="Supprimer panier" /></p>
</form>
<?php
} # fin de SI is_array($_SESSION['panier']['contenu']
else {
# tableau panier est vide
echo '<p class="message">Vide</p>';
}
?>
</div>
Ces programmes utilsent une base de données MySQL nommée = "ecommerce_2" qu'il faut créé dans PHPMyADMIN et créer son contenu par le script suivant:
-- phpMyAdmin SQL Dump
-- version 3.4.10.1
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le : Ven 13 Juillet 2012 à 22:47
-- Version du serveur: 5.5.20
-- Version de PHP: 5.3.10
--
-- Base de données: `ecommerce_2`
--
-- --------------------------------------------------------
--
-- Structure de la table `catalogue`
--
CREATE TABLE IF NOT EXISTS `catalogue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`designation` varchar(255) NOT NULL,
`photo` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
--
-- Contenu de la table `catalogue`
--
INSERT INTO `catalogue` (`id`, `designation`, `photo`) VALUES
(1, 'Sachet transparent', 'Sachet_transparent.jpg'),
(2, 'Sachet blanc', 'Sachet_blanc.jpg'),
(3, 'Sachet réglisse', 'Sachet_reglisse.jpg'),
(4, 'Sachet rose pastelle', 'Sachet_rose_pastelle.jpg'),
(5, 'Sachet rose', 'Sachet_rose.jpg'),
(6, 'Sachet bleu', 'Sachet_bleu.jpg'),
(7, 'Sachet violet', 'Sachet_violet.jpg'),
(8, 'Sachet jaune', 'Sachet_jaune.jpg');
-- --------------------------------------------------------
--
-- Structure de la table `commande`
--
CREATE TABLE IF NOT EXISTS `commande` (
`id_commande` varchar(255) NOT NULL,
`date_commande` datetime NOT NULL,
`email` varchar(255) NOT NULL,
`total` float NOT NULL DEFAULT '0',
PRIMARY KEY (`id_commande`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `commande`
--
INSERT INTO `commande` (`id_commande`, `date_commande`, `email`, `total`) VALUES
('[email protected]', '2012-07-13 21:36:50', '[email protected]', 76.95);
-- --------------------------------------------------------
--
-- Structure de la table `panier`
--
CREATE TABLE IF NOT EXISTS `panier` (
`id_commande` varchar(255) NOT NULL,
`id_produit` int(11) NOT NULL,
`qte` int(11) NOT NULL,
`prix` float NOT NULL,
UNIQUE KEY `id_commande` (`id_commande`,`id_produit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `panier`
--
INSERT INTO `panier` (`id_commande`, `id_produit`, `qte`, `prix`) VALUES
('[email protected]', 1, 1, 4.99),
('[email protected]', 2, 1, 4.99),
('[email protected]', 3, 3, 12),
('[email protected]', 4, 1, 4.99),
('[email protected]', 6, 2, 9.98),
('[email protected]', 8, 10, 40);
Ces fichiers doivent être logés dans un dossier de projet nommé "panier" qui contient un sous-dossier nommé "images" pour les images des produits vendus.
J'espère que ça va aider.