Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/08/2008, 10h00   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
Par défaut session sur mise en place du tuto de panier

Bonjour à tous,

J'ai essayé hier de mettre en place un panier sur un site en adaptant le tuto présent sur le site. Malheureusement, après des heures de galère, je n'y suis toujours pas arrivé.

Ce matin j'ai donc essayé de prendre le tuto tel qu'il était et de le faire tourner en local afin de voir si cela ne pouvait pas venir de là et effectivement en local je n'arrive pas à le faire tourner non plus

Dans la version locale (que j'adapterai plus tard), j'ai bien copié collé (bêtement) l'ensemble du code présent sur le tuto et j'ai créé également une page "catalogue.php" dans laquelle j'ai uniquement créé 4 liens d'ajout au panier.
Voici le contenu de cette page :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
<?php
session_start();
?>
 
 
<a href="panier.php?action=ajout&amp;l=PROD1&amp;q=1&amp;p=10" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 1</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD2&amp;q=2&amp;p=20" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 2</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD3&amp;q=3&amp;p=30" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 3</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD4&amp;q=4&amp;p=40" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 4</a><br>
Lorsque je fais tourner le script et que je clique sur un lien de ma page catalogue, j'obtiens bien le popup m'indiquant que le produit est dans le panier, jusque là pas de problème.
En revanche, lorsque je retourne sur ma page catalogue pour cliquer sur un autre produit, je ne vois que le nouveau produit, la session n'a pas conservé le précédent
D'autre part, si sur le popup je clique sur le bouton "actualiser" qui lance la mise à jour suivant les quantités, je me retrouve avec le panier vide

Franchement je ne comprends pas trop ce qui se passe...

Si vous avez des pistes...

D'autre part, une chose un peu obscure pour moi : pourquoi le panier s'affiche dans une popup ? Est ce que cela a quelque chose à voir avec la session ? Pourquoi ne pas l'afficher directement dans la page active ?

url du tuto : http://jcrozier.developpez.com/articles/web/panier/
de mon côté je suis en php 5.2.5
Sur mes autres projets locaux, je n'ai aucun problème de gestion des sessions, idem quand je mets en ligne, ce qui me pose problème pour ce panier pour être très clair c'est la gestion des arrays dans la session
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 10h54   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 383
Points : 16 383
Est ce qu'on pourrait voir la page ajout.php ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 12h45   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
Bonjour,

Merci de ton intérêt pour mon problème

La page d'ajout d'un produit est le code que j'ai posté ci-dessus, uniquement pour test une suite de 4 urls correspondant à 4 produits distincts.

J'ai respecté la forme de l'url donnée dans le tuto mais malheureusement cela ne fonctionne pas
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 13h19   #4
Rédacteur
 
Avatar de RideKick
 
Homme
Directeur technique
Inscription : septembre 2006
Messages : 5 959
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Directeur technique
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2006
Messages : 5 959
Points : 10 889
Points : 10 889
Citation:
Envoyé par kosmos-guru Voir le message
D'autre part, une chose un peu obscure pour moi : pourquoi le panier s'affiche dans une popup ? Est ce que cela a quelque chose à voir avec la session ? Pourquoi ne pas l'afficher directement dans la page active ?
C'est un choix comme un autre , rien a voir avec les sessions , si tu veux , tu peux mettre ta page panier.php normalement et l 'appeler par un simple lien et non par une popup js.

As tu bien le session_start() sur la page panier.php ?
__________________
Pas de questions techniques en MP please

Mon site perso
RideKick est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 13h28   #5
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
Bonjour Ridekick,

...et merci pour le tuto, même si pour l'instant je n'arrive pas à le faire tourner, cela a le mérite de me faire chercher !!!

Alors pour te répondre :
- oui j'ai bien mis le session_start()
- ok pour le popup, je me demandais si cela ne pouvait pas être un problème type : il faut une nouvelle page pour actualiser la session.

edit > je suis entrain de me refaire une version de 0 en partant de cette base mais uniquement avec le produit, sans prendre en compte les quantités et les prix. Cela va me permettre dans un premier temps de tester ce qui se passe dans cette maudite session De plus, je fais tout sur une page unique pour l'instant.
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 13h33   #6
Rédacteur
 
Avatar de RideKick
 
Homme
Directeur technique
Inscription : septembre 2006
Messages : 5 959
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Directeur technique
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2006
Messages : 5 959
Points : 10 889
Points : 10 889
tu peux montrer tout tes fichiers que tu utilise complètement stp ?

dans ton message initial tu dis que ta page catalogue ne contient que 4 liens HTML et quand tu reviens dessus elle n'en contient qu'un.

C'est un peu confus pour nous pour t'aider
__________________
Pas de questions techniques en MP please

Mon site perso
RideKick est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 14h55   #7
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
ok, voici l'exemple copie directement du tuto :

page panier.php :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
<?php
session_start();
include_once("./inc/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" border=1>
<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>
page catalogue.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
<?php
session_start();
?>
 
 
<a href="panier.php?action=ajout&amp;l=PROD1&amp;q=1&amp;p=10" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 1</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD2&amp;q=2&amp;p=20" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 2</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD3&amp;q=3&amp;p=30" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 3</a><br>
 
<a href="panier.php?action=ajout&amp;l=PROD4&amp;q=4&amp;p=40" onclick="window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;">Ajouter 4</a><br>

fonctions-panier.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
<?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;
}
 
 
 
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.";
}
 
 
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.";
}
 
 
 
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.";
}
 
 
function MontantGlobal(){
 
$total=0;
 
  for($i = 0; $i < count($_SESSION['panier']['libelleProduit']); $i++) 
  {            
   $total += $_SESSION['panier']['qteProduit'][$i] * $_SESSION['panier']['prixProduit'][$i]; 
  }
 
return $total;
}
 
 
?>


Sinon, je crois que l'on s'est mal compris, en fait ce que je voulais dire c'est que lorsque je mettais un objet dans le panier, celui ci s'affichait bien, jusque la tout va bien. Le problème c'est que lorsque je retourne sur ma page catalogue.php et que je sélectionne un autre produit, celui ci devrait venir en plus du précédent dans le panier hors ce n'est pas le cas, dans le panier je n'ai que le produit que je viens de cliquer
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 15h27   #8
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
ridekick...

j'ai honte, j'ai franchement plus que honte...
comme je voyais vraiment pas ma boulette sur le panier dans son plus simple appareil (ma version), j'ai ete voir les logs php...
et la... c'est le drame
"headers already sent..."
voila voila !
en clair j'ai laisse une ligne vide avant le session_start() !!! fallait le faire quand meme !!!

bon je reprends le tien (sur lequel se trouve la boulette initiale) et si j'ai un souci je reviens

merci en tout cas !
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h55   #9
Invité de passage
 
Inscription : janvier 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 6
Points : 1
Points : 1
Hello,

Bon ça y est ça tourne, me reste encore quelques modifs à faire sachant que mon panier est assez particulier (pas de total car c'est pour une demande de devis et plus de champs modifiables car plusieurs caractéristiques produits).

Un GRAND MERCI à RideKick pour ce tuto qui m'a permis de corriger certaines lacunes que j'avais sur les sessions
kosmos-guru est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h03.


 
 
 
 
Partenaires

Hébergement Web