Qui peut m'expliquer les fonctions et leur utilisation?

Eléphant du PHP | 254 Messages

25 juin 2006, 15:05

coucou me revoilou...bon j'arrive pas à afficher autrement que par un var_dump() le panier...mais j'avance !
Alors, je récupère bien des élements, mais la quantité ne se modifie pas, il ajoute systématiquement le même cours..
Voilà où j'en suis :
<?php 
/* Démarrage ou prolongation de la session */ 
session_start(); 
require_once('fonctions_panier.php'); 
require_once('Connections/connexion.php'); 
/* Article exemple */ 
$select = array(); 
$select['id'] = $_GET['ID_session']; 
$select['qte'] = 1; 
$select['ID_cours'] = $_GET['ID_cours']; 
$select['date_debut'] = $_GET['date_debut']; 
$select['horaires'] = $_GET['horaires']; 
$select['intitule'] = $_GET['intitule']; 
$select['prix'] = $_GET['prix']; 
$ref_article = $select['id'];
$qte = 1;
/* 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']['qte'] = array(); 
    $_SESSION['panier']['ID_cours'] = array(); 
    $_SESSION['panier']['date_debut'] = array(); 
    $_SESSION['panier']['horaires'] = array(); 
    $_SESSION['panier']['intitule'] = array(); 
    $_SESSION['panier']['prix'] = array(); 
} 

$ok = ajout($select);
et la page fonctions_panier.php
Qui est une reprise du tuto
<?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']['qte'],$select['qte']); 
            array_push($_SESSION['panier']['ID_cours'],$select['ID_cours']); 
            array_push($_SESSION['panier']['date_debut'],$select['date_debut']); 
            array_push($_SESSION['panier']['horaires'],$select['horaires']); 
            array_push($_SESSION['panier']['intitule'],$select['intitule']); 
            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_session']); 
            /* 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_session'][$i]) 
                { 
                    $_SESSION['panier']['ID_session'][$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; 
} 

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 
/*                 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_session']); 
    /* 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_session'][$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_session']); 
    /* 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(array_search($ref_article,$_SESSION['panier']['ID_session']) != false) 
    { 
        $present = true; 
    } 
    return $present; 
} 


?> 
J'ai du m'enmeler les doigts sur le clavier avec les récups de variables et données !!!
grumph !
:roll: ](*,)
array(7) {
["qte"]=>
array(2) {
[0]=>
int(1)
[1]=>
int(1)
}
["ID_cours"]=>
array(2) {
[0]=>
string(1) "3"
[1]=>
string(1) "3"
}
["date_debut"]=>
array(2) {
[0]=>
string(10) "2006-07-01"
[1]=>
string(10) "2006-07-01"
}
["horaires"]=>
array(2) {
[0]=>
string(13) "10h30 à 13h30"
[1]=>
string(13) "10h30 à 13h30"
}
["intitule"]=>
array(2) {
[0]=>
string(7) "cours 1"
[1]=>
string(7) "cours 1"
}
["prix"]=>
array(2) {
[0]=>
string(6) "100.00"
[1]=>
string(6) "100.00"
}
["ID_session"]=>
NULL
}
Pourquoi il me met un ID_session NULL ? à la fin ?
:?:
C'est la variable $ref_article que je n'itialise pas bien ???
Merci pour votre aide les grands maitres du php ! :agenouille:

Eléphant du PHP | 254 Messages

26 juin 2006, 08:57

re !
Alors j 'ai un peu avancé, je n'ai plus les messages d'erreurs, mais je crois que c'est la quantité que je gère mal...
Car le panier ne s'enrichit pas de toute la sélection d'articles, mais de la dernière à chaque fois :roll:
Voici comment je récupère les variables
/* Article exemple */ 
$select = array(); 
$select['id'] = $_GET['ID_session']; 
$select['qte'] = 1; 
$select['ID_cours'] = $_GET['ID_cours']; 
$select['date_debut'] = $_GET['date_debut']; 
$select['horaires'] = $_GET['horaires']; 
$select['intitule'] = $_GET['intitule']; 
$select['prix'] = $_GET['prix']; 
$ref_article = $_GET['ID_session'];
$qte = $_GET['qte'];
et voici ce que j'en fais....dans les fonctions panier
function ajout($select) 
{ 
    $ajout = false; 
    if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) 
    { 
        if(!verif_panier($select['id'])) 
        { 
					
            array_push($_SESSION['panier']['ID_session'],$select['id']); 
            array_push($_SESSION['panier']['qte'],$select['qte']); 
            array_push($_SESSION['panier']['ID_cours'],$select['ID_cours']); 
            array_push($_SESSION['panier']['date_debut'],$select['date_debut']); 
            array_push($_SESSION['panier']['horaires'],$select['horaires']); 
            array_push($_SESSION['panier']['intitule'],$select['intitule']); 
            array_push($_SESSION['panier']['prix'],$select['prix']);   
            $ajout = true; 
        } 
        else 
        { 
            $ajout = modif_qte($select['id'],$select['qte']); 
        } 
    } 
    return $ajout; 
} 
Est-ce que je dois définir la quantité comme je le fais en posant "1" ?
Ou bien l'associer à la référence ?
:?:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 juin 2006, 10:05

Dans ton code, c'est le contenu du tableau $select qui est important, c'est lui que tu vas mettres dans ton panier. Dans la mesure où dans tous les cas tu l'as définie à 1, il va difficilement pouvoir l'augmenter ;)

En fait, ta fonction ajout contrôle la présence de l'élément $select['id'] (donc de ton $_GET['ID_session']) dans le panier :
if (!verif_panier($select['id'])
S'il ne le trouve pas, il insère le produit (avec toutes les infos qui vont bien) dans le panier. S'il le trouve, il se contente juste de mettre à jour la quantité :
else
  $ajout = modif_qte($select['id'],$select['qte']); 
Tout ce dont tu dois t'assurer, c'est que le tableau $select est bien renseigné avec l'id de ton article et la bonne quantité.

Au lieu de :
$select['qte'] = 1; 
...
$qte = $_GET['qte']; // (ceci ne sert donc à rien, c'est dans $select qu'il faut définir la quantité. C'est $select que tu passes comme argument à ta fonction :)


Il te faudrait quelque chose du genre :
 // si une quantité est définie, on l'utilise, sinon on la définie à 1 par défaut
$select['qte'] = (isSet($_GET['qte'])) ? $_GET['qte'] : 1 ; 


Ainsi, si dans ton lien, tu ne met pas qte=xx, alors ta quantité sera égale à 1, et si dans ton lien tu mets 0 ou 5, et que le produit existe déjà dans le panier, sa quantité sera automatiquement mise à jour lors de l'appel à la fonction ajout : elle va faire appel à ta fonction modif_qte() qui supprime très certainement l'article si la quantité est égale à 0, ou met à jour la ligne correspondante sinon ;)


Et puis pour afficher le tableau autrement que par un var_dump, il te faut en fait afficher chaque élément du panier dans l'ordre :
- la première qte ['qte'][0] correspond au premier article ['ID_session'][0] et au premier intitulé ['intitule'][0] , ...
- la deuxième qte ['qte'][1] correspond au deuxième article ['ID_session'][1], ...

Invité
Invité n'ayant pas de compte PHPfrance

26 juin 2006, 11:15

Hello M.. (oups) Ryle :lol: :wink:
hihi
Alors merci de ta réponse ! Ca m'aide bcp car effectivement je me suis bien dit que la quantité était toujours de un.
Mais alors, comment la paramétrer, puisque je ne vais pas la mettre dans le lien, je ne pose pas la variable comme je l'avais fait.
Et je pose donc la condition que tu me suggère.
Ce que je ne comprends pas, c'est que le calcul 1+1 si même $select['id'] ne se fait pas.
Ca veut dire que ma vérif ne se fait pas non plus ?
Pour l'affichage, je dois l'inclure dans une boucle...j'imagine
for ($i=0;$i<count($select['id']);$i++) non ?
Je refais des essais, mais je vois bien que mon truc n'est pas encore au point...il me faut encore bcp apprendre :wink: :-k

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 juin 2006, 11:48

Attention toi, un coup de défense ça peut faire très mal ;p

En fait y a une chtite subtilité dans le panier de cyrano quant à la quantité : il ne met pas un nouvel article à chaque fois que tu en ajoutes un, mais va modifier l'article existant pour lui dire combien tu en veux. Donc c'est pas physiquement ton panier de course quand tu vas au supermarché du coin où quand tu veux deux articles t'en colles deux dans ton panier, mais plus ton panier catalogue la redoute livré en 48h chrono, que quand tu en veux deux, t'efface le 1 dans la grille et tu mets un 2 à la place :)

En gros, la quantité que tu dois indiquer n'est pas ce que tu ajoutes à celle déjà présente, mais la quantité finale. (L'idée étant d'avoir un champ dans lequel l'utilisateur saisi combien il en veut, et que tu colleras dans $select)

Bon bien sur tu peux le bricoler pour que ca augmente d'un la quantité à chaque fois que tu cliques sur le lien, mais ca complique quand au contraire tu veux en retirer un.. :)

Invité
Invité n'ayant pas de compte PHPfrance

26 juin 2006, 12:27

C'est bien ce qu'il me semblait !
Après avoir scanné chaque ligne de son code !
J'ai donc rajouté un champ quantité, à droite duquel je vais appeler la fonction modif_quantite.
Thank's
Je file déjeuner je reviendrais plus tard !
J'ai faiiiiim

Eléphant du PHP | 254 Messages

26 juin 2006, 12:28

grrr j'ai été déconnectée ...
Combien de temps dure la session ici ? :?:
Arf arf ! :lol: 8)

Eléphant du PHP | 254 Messages

26 juin 2006, 13:58

bon !
J'ai des progrès à faire, je vois que j'arrive à utiliser les tblx multidimensionnels, les sessions etc...comme là il s'agissait d'essayer de comprendre les fonctions et l'appel aux fonctions, j'ai vu.
De là à mettre en application c'est moins évident.
Alors je pense que je vais essayer de construire mes propres fonctions.
Je vais étudier le pattern PRG, je trouve ça extra !
Le header m'a enlevé une épine du pied !!!
:lol:
Chuis contente !
Bye bye !!! j'arrete là ça chauffe trop et merciiiiiii de votre aide les gars! :love4: