Page 1 sur 1

tuto panier en php: besoin d'explications

Posté : 29 janv. 2008, 17:50
par dread
Bonjour à tous!

Je me suis lançé dans la construction d'un panier pour une boutique en ligne.
J'ai trouvé un tuto sympa à l'adresse suivante: http://jmolline.free.fr/tutos/tuto_panier.html

Néanmoins, j'essaie de l'adapter afin qu'il puisse fonctionner avec un formulaire d'ajout de produits puis de modification ou suppression.
La modification et/ou la suppression interviendraient sur un page récapitulative de l'ensemble des produits commandés.

Ma question, concernant le tutorial du panier, porte sur la récupération des données enregistrées dans le tableau en session $_session['panier'] afin d'afficher les critères sous la forme d'une liste avec les possibilités de modifier les quantités ou de supprimer l'article.

J'ai bien tenté de faire un echo de $_session['panier']['id_article'][0] afin d'afficher l'identifiant du premier article enregistré mais rien n'apparait.

J'avoue avoir quelques difficultés aussi à coupler un formulaire d'ajout de produit au code donné par le tuto, mais chaque chose en son temps et je creuse la question de mon côté.

Merci pour toute aide apportée.

Posté : 29 janv. 2008, 17:59
par h0_noMan
Verifies que tu as bien un session_start() au debut de ton script php.

Puis fait un print_r($_SESSION) pour afficher tout le contenu des variables de sessions.

Posté : 29 janv. 2008, 18:07
par Ryle
Attention également à la casse des lettres, si celle-ci importe peu dans le nom des fonctions, elle est en revanche prise en compte dans celui des variables. Ainsi "$_session" est différent de "$_SESSION" :)

Posté : 29 janv. 2008, 18:39
par dread
merci pour vos réponses rapides. J'avais bien un problème de casse et je m'excuse d'une erreur aussi bête.
Je me concentre donc sur la récupération des éléments par l'intermédiaire d'un formulaire et là encore je rencontre des difficultés.
Je vous montre le code de ma page ou je rentre mes infos:
<?php 
/* Démarrage ou prolongation de la session */ 
session_start(); 

$select = array(); 
$select['id'] = $_POST['id_article']; 
$select['qte'] = $_POST['qte']; 
$select['taille'] = $_POST['taille']; 
$select['prix'] = $_POST['prix']; 

/* On vérifie l'existence du panier, sinon, on le crée */ 
if(!isset($_SESSION['panier'])) 
{ 
    /* Initialisation du panier */ 
    $_SESSION['panier'] = array(); 
    /* Subdivision du panier */ 
	$_SESSION['panier']['id_article'] = array();
    $_SESSION['panier']['qte'] = array(); 
    $_SESSION['panier']['taille'] = array(); 
    $_SESSION['panier']['prix'] = array(); 
} 

include('panier.php');
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test du panier</title>
<meta name=""/>
<meta name="Keywords" content=""/>
<link href="" rel="stylesheet" type="text/css" />
</head>
 
<body>

<div id="global">
	<form name="frm_panier" id="frm_panier"  method="post" action="index.php">
		id: <input name="id_article" id="id_article" />
		quantité: <input name="qte" id="qte" />
		taille: <input name="taille" id="taille" />
		prix: <input name="prix" id="prix" />
		<input type="submit" name="submit" value="acheter"/>
	</form>
<pre> 
<?php 
var_dump($_SESSION['panier']); 
echo 'id: '.$_SESSION['panier']['id_article'][0];
?> 
</pre>
</div>


</body>
</html>
je fais un include de la page 'panier.php' contenant le code présent sur le tuto tout à la fin et qui récapitule l'ensemble de la démarche du panier.
Lorsque je rentre mes données, rien ne s'enregistre dans mon tableau.
J'ai du rater une étape quelque part.
Par contre je n'ai pas mis de ajout($select); sous
$select = array(); 
$select['id'] = $_POST['id_article']; 
$select['qte'] = $_POST['qte']; 
$select['taille'] = $_POST['taille']; 
$select['prix'] = $_POST['prix']; 
puisque cela n'a à priori pas d'impact.
Je continue de chercher mais surtout interompez moi si je fais encore une erreur grossière.
Merci.

Posté : 29 janv. 2008, 21:15
par Truc
Par contre je n'ai pas mis de ajout($select); sous
...
puisque cela n'a à priori pas d'impact.
Me semble que c'est la fonction qui ajoute le contenu du formulaire au panier... donc un petit impact tout de même ;)

Posté : 30 janv. 2008, 10:09
par dread
Merci Truc pour ta réponse!

Il y a bien un impact: il m'affiche à présent une erreur lorsque je rajoute ajout($select);
Fatal error: Call to undefined function ajout() in E:\wamp\www\panier\index.php on line 10

Je tiens à rappeler que je fais un include d'un fichier 'panier.php' contenant le code suivant, code présent sur le tuto et auquel je n'ai pas apporté de modification:
<?php 
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 
/*                Fonctions de base de gestion du panier                   */ 
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 

/** 
* Ajoute un article dans le panier après vérification que nous ne somme pas en phase de paiement 
* 
* @param array  $select variable tableau associatif contenant les valeurs de l'article 
* @return Mixed Retourne VRAI si l'ajout est effectué, FAUX sinon voire une autre valeur si l'ajout 
*               est renvoyé vers la modification de quantité. 
* @see {@link modif_qte()} 
*/ 
function ajout($select) 
{ 
    $ajout = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        if(!verif_panier($select['id'])) 
        { 
            array_push($_SESSION['panier']['id_article'],$select['id']); 
            array_push($_SESSION['panier']['qte'],$select['qte']); 
            array_push($_SESSION['panier']['taille'],$select['taille']); 
            array_push($_SESSION['panier']['prix'],$select['prix']); 
            $ajout = true; 
        } 
        else 
        { 
            $ajout = modif_qte($select['id'],$select['qte']); 
        } 
    } 
    return $ajout; 
} 

/** 
* Modifie la quantité d'un article dans le panier après vérification que nous ne somme pas en phase de paiement 
* 
* @param String $ref_article    Identifiant de l'article à modifier 
* @param Int $qte               Nouvelle quantité à enregistrer 
* @return Mixed                 Retourne VRAI si la modification a bien eu lieu, 
*                               FAUX sinon, 
*                               "absent" si l'article est absent du panier, 
*                               "qte_ok" si la quantité n'est pas modifiée car déjà correctement enregistrée. 
*/ 
function modif_qte($ref_article, $qte) 
{ 
    /* On initialise la variable de retour */ 
    $modifie = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        if(nombre_article($ref_article) != false && $qte != nombre_article($ref_article)) 
        { 
            /* On compte le nombre d'articles différents dans le panier */ 
            $nb_articles = count($_SESSION['panier']['id_article']); 
            /* On parcoure le tableau de session pour modifier l'article précis. */ 
            for($i = 0; $i < $nb_articles; $i++) 
            { 
                if($ref_article == $_SESSION['panier']['id_article'][$i]) 
                { 
                    $_SESSION['panier']['qte'][$i] = $qte; 
                    $modifie = true; 
                } 
            } 
        } 
        else 
        { 
            /* L'article est absent du panier, donc on ne peut pas modifier la quantité ou bien 
            * le nombre est exactement le même et il est inutile de le modifier 
            * Si l'article est absent, comme on a ni la taille  ni le prix, on ne peut pas l'ajouter 
            * Si le nombre est le même, on ne fait pas de changement. On peut donc retourner un autre 
            * type de valeur pour indiquer une erreur qu'il faudra traiter à part lors du retour d'appel 
            */ 
            if(nombre_article($ref_article) != false) 
            { 
                $modifie = "absent"; 
            } 
            if($qte != nombre_article($ref_article)) 
            { 
                $modifie = "qte_ok"; 
            } 
        } 
    } 
    return $modifie; 
} 

/** 
* Supprimer un article du panier après vérification que nous ne somme pas en phase de paiement 
* 
* @param String     $ref_article numéro de référence de l'article à supprimer 
* @return Mixed     Retourne TRUE si la suppression a bien été effectuée, 
*                   FALSE sinon, "absent" si l'article était déjà retiré du panier 
*/ 
function supprim_article($ref_article) 
{ 
    $suppression = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        /* On vérifie que l'article à supprimer est bien présent dans le panier */ 
        if(nombre_article($ref_article) != false) 
        { 
            /* création d'un tableau temporaire de stockage des articles */ 
            $panier_tmp = array("id_article"=>array(),"qte"=>array(),"taille"=>array(),"prix"=>array()); 
            /* Comptage des articles du panier */ 
            $nb_articles = count($_SESSION['panier']['id_article']); 
            /* Transfert du panier dans le panier temporaire */ 
            for($i = 0; $i < $nb_articles; $i++) 
            { 
                /* On transfère tout sauf l'article à supprimer */ 
                if($_SESSION['panier']['id_article'][$i] != $ref_article) 
                { 
                    array_push($panier_tmp['id_article'],$_SESSION['panier']['id_article'][$i]); 
                    array_push($panier_tmp['qte'],$_SESSION['panier']['qte'][$i]); 
                    array_push($panier_tmp['taille'],$_SESSION['panier']['taille'][$i]); 
                    array_push($panier_tmp['prix'],$_SESSION['panier']['prix'][$i]); 
                } 
            } 
            /* Le transfert est terminé, on ré-initialise le panier */ 
            $_SESSION['panier'] = $panier_tmp; 
            /* Option : on peut maintenant supprimer notre panier temporaire: */ 
            unset($panier_tmp); 
            $suppression = true; 
        } 
        else 
        { 
            $suppression == "absent"; 
        } 
    } 
    return $suppression; 
} 

/** 
* Supprimer un article du panier : autre méthode. 
* 
* @param String     $ref_article numéro de référence de l'article à supprimer 
* @param Boolean    $reindex : facultatif, par défaut, vaut true pour ré-indexer le tableau après 
*                   suppression. On peut envoyer false si cette ré-indexation n'est pas nécessaire. 
* @return Mixed     Retourne TRUE si la suppression a bien été effectuée, 
*                   FALSE sinon, "absent" si l'article était déjà retiré du panier 
*/ 
function supprim_article2($ref_article, $reindex = true) 
{ 
    $suppression = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        $aCleSuppr = array_keys($_SESSION['panier']['id_article'], $ref_article); 

        /* sortie la clé a été trouvée */ 
        if (!empty ($aCleSuppr)) 
        { 
            /* on traverse le panier pour supprimer ce qui doit l'être */ 
            foreach ($_SESSION['panier'] as $k=>$v) 
            { 
                foreach($aCleSuppr as $v1) 
                { 
                    unset($_SESSION['panier'][$k][$v1]);    // remplace la ligne foireuse 
                } 
                /* Réindexation des clés du panier si l'option $reindex a été laissée à true */ 
                if($reindex == true) 
                { 
                    $_SESSION['panier'][$k] = array_values($_SESSION['panier'][$k]); 
                } 
                $suppression = true; 
            } 
        } 
        else 
        { 
            $suppression = "absent"; 
        } 
    } 
    return $suppression; 
} 

/** 
* Fonction qui supprime tout le contenu du panier en détruisant la variable après 
* vérification qu'on ne soit pas en phase de paiement. 
* 
* @return Mixed    Retourne VRAI si l'exécution s'est correctement déroulée, Faux sinon et "inexistant" si 
*                  le panier avait déjà été détruit ou n'avait jamais été créé. 
*/ 
function vider_panier() 
{ 
    $vide = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        if(isset($_SESSION['panier'])) 
        { 
            unset($_SESSION['panier']); 
            if(!isset($_SESSION['panier'])) 
            { 
                $vide = true; 
            } 
        } 
        else 
        { 
            /* Le panier était déjà détruit, on renvoie une autre valeur exploitable au retour */ 
            $vide = "inexistant"; 
        } 
    } 
    return $vide; 
} 

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 
/*                 Fonctions annexes de gestion du panier                  */ 
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 

/** 
* Vérifie la quantité enregistrée d'un article dans le panier 
* 
* @param String $ref_article référence de l'article à vérifier 
* @return Mixed Renvoie le nombre d'article s'il y en a, ou Faux si cet article est absent du panier 
*/ 
function nombre_article($ref_article) 
{ 
    /* On initialise la variable de retour */ 
    $nombre = false; 
    /* Comptage du panier */ 
    $nb_art = count($_SESSION['panier']['id_article']); 
    /* On parcoure le panier à la recherche de l'article pour vérifier le cas échéant combien sont enregistrés */ 
    for($i = 0; $i < $nb_art; $i++) 
    { 
        if($_SESSION['panier']['id_article'][$i] == $ref_article) 
        $nombre = $_SESSION['panier']['qte'][$i]; 
    } 
    return $nombre; 
} 

/** 
* Calcule le montant total du panier 
* 
* @return Double 
*/ 
function montant_panier() 
{ 
    /* On initialise le montant */ 
    $montant = 0; 
    /* Comptage des articles du panier */ 
    $nb_articles = count($_SESSION['panier']['id_article']); 
    /* On va calculer le total par article */ 
    for($i = 0; $i < $nb_articles; $i++) 
    { 
        $montant += $_SESSION['panier']['qte'][$i] * $_SESSION['panier']['prix'][$i]; 
    } 
    /* On retourne le résultat */ 
    return $montant; 
} 

/** 
* Vérifie la présence d'un article dans le panier 
* 
* @param String $ref_article référence de l'article à vérifier 
* @return Boolean Renvoie Vrai si l'article est trouvé dans le panier, Faux sinon 
*/ 
function verif_panier($ref_article) 
{ 
    /* On initialise la variable de retour */ 
    $present = false; 
    /* On vérifie les numéros de références des articles et on compare avec l'article à vérifier */ 
    if( count($_SESSION['panier']['id_article']) > 0 && array_search($ref_article,$_SESSION['panier']['id_article']) !== false) 
    { 
        $present = true; 
    } 
    return $present; 
} 

/** 
* Fonction de verrouillage du panier pendant la phase de paiement. 
* 
*/ 
function preparerPaiement() 
{ 
    $_SESSION['panier']['verrouille'] = true; 
    header("Location: URL_DU_SITE_DE_BANQUE"); 
} 

/** 
* Fonction qui va enregistrer les informations de la commande dans 
* la base de données et détruire le panier. 
* 
*/ 
function paiementAccepte() 
{ 
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 
    /*   Stockage du panier dans la BDD   */ 
    /* ajoutez ici votre code d'insertion */ 
    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 
    unset($_SESSION['panier']); 
} 
?> 
Je me pose donc les questions suivantes:
- est-ce que mon include fonctionne?
- est-ce que je dois placer le code présent sur mon autre page (celle contenant mon formulaire) avant l'include, la fonction ajout($select) étant alors définie après l'utilisation de ce fameux ajout($select); ?

Merci encore pour votre aide.

[edit] j'ai placé le bout de code suivant après la function ajout($select); et ca semble fonctionner:
$select = array(); 
$select['id'] = $_POST['id_article']; 
$select['qte'] = $_POST['qte']; 
$select['taille'] = $_POST['taille']; 
$select['prix'] = $_POST['prix']; 
ajout($select);
Mais si je m'égare n'hésitez pas à me remmettre sur le bon chemin.

Je continue donc mon adaptation du code à un formulaire d'ajout, puis une liste récupérant l'ensemble des articles ajoutés afin de modifier les quantités ou de supprimer certains articles.
Par contre j'ai reperdu la valeur de
echo $_SESSION['panier']['id_article'][0];
alors que j'ai bien des articles d'enregistrer puisque je les visualise via var_dump($_SESSION['panier']);
Un avis?
[/edit]

Posté : 30 janv. 2008, 12:15
par Truc
Par contre j'ai reperdu la valeur de
echo $_SESSION['panier']['id_article'][0];
alors que j'ai bien des articles d'enregistrer puisque je les visualise via var_dump($_SESSION['panier']);
Comprend pas :-k
ça veut dire quoi "reperdu" pour toi si en même temps var_dump() affiche le résultat attendu ?

Posté : 30 janv. 2008, 12:20
par iclo
echo $_SESSION['panier']['id_article'][0];
[/php]
alors que j'ai bien des articles d'enregistrer puisque je les visualise via var_dump($_SESSION['panier']);
Vérifie bien que la session contient bien un tableau panier, qui contient un tableau id_article, qui contient bien un élément à l'indice 0.

Posté : 30 janv. 2008, 13:17
par dread
Et comment dois-je procéder pour vérifier ces éléments, stp?
Sinon, voici ce que me donne le var_dump($_SESSION['panier']);

Code : Tout sélectionner

array(4) { ["id_article"]=> array(2) { [0]=> NULL [1]=> string(5) "alpha" } ["qte"]=> array(2) { [0]=> NULL [1]=> string(2) "10" } ["taille"]=> array(2) { [0]=> NULL [1]=> string(1) "M" } ["prix"]=> array(2) { [0]=> NULL [1]=> string(2) "50" } }

Posté : 30 janv. 2008, 13:23
par iclo
Ton id 0 dans les différents tableau est à NULL, en d'autres mots, cette indice ne contient rien. J'ai l'impression que le premier article est ajouté en indice 1 et non pas 0.

Posté : 04 févr. 2008, 18:07
par dread
Ton id 0 dans les différents tableau est à NULL, en d'autres mots, cette indice ne contient rien. J'ai l'impression que le premier article est ajouté en indice 1 et non pas 0.
Merci pour vos réponses qui m'ont permis de bien avancer.

Par contre, je pense que cette histoire de id 0 --> NULL dans le tableau me pose des difficultés. Est-il possible de régler ce problème afin d'avoir une entrée qui commance à 0 et non à 1?

Posté : 04 févr. 2008, 18:18
par Truc
certainement... tu dois avoir un appel à ajout() avec un paramètre vide :-k

Posté : 04 févr. 2008, 18:25
par dread
Peut-être même si je vois pas trop où.
Voici le code d'ajout de produits:
$select = array(); 
$select['id'] = $_POST['id_article']; 
$select['qte'] = $_POST['qte'];  
$select['prix'] = $row_prix['prix_article']; 
ajout($select);

function ajout($select) 
{ 
    $ajout = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        if(!verif_panier($select['id'])) 
        { 
            array_push($_SESSION['panier']['id_article'],$select['id']); 
            array_push($_SESSION['panier']['qte'],$select['qte']); 
            array_push($_SESSION['panier']['prix'],$select['prix']); 
            $ajout = true; 
        } 
        else 
        { 
            $ajout = modif_qte($select['id'],$select['qte']); 
        } 
    } 
    return $ajout; 
} 
En plus, quand mon tableau est vide, il y a déjà la valeur null dans mon tableau pour l'id 0.
[edit] Je viens de comprendre ce que tu m'as dit. Il fallait juste empecher l'execution de ajout($select) tant qu'aucun article n'avait été acheté.
Merci [/edit]