Panier n'affiche qu'un produit à la fois ?

Fermé
Lolo - 11 août 2011 à 10:01
 Utilisateur anonyme - 12 août 2011 à 14:35
Bonjour,

Je suis presque à la fin de mon site e-commerce. Il ne me reste plus qu'à régler le panier. J'avoue qu'entant que débutante j'ai chercher un script prêt à l'emploi. J'ai donc insérer dans mon script personnel celui de jcrozier.developpez.com Il est très bien mais j'ai quelques soucis.

1) Il n'affiche que les premières lettre/chiffre du produit et du prix sélectionnés.

J'ai procédé de la façon suivante : formulaire method POST pour ajouter au panier et en même temps dans la bdd panier. Comme le panier utilise $_SESSION et que mon formulaire et en POST, j'ai fais :

<?php
session_start();
include_once("fonction-panier.php");
echo '<?xml version="1.0" encoding="utf-8"?>';?>
<?php
$_SESSION['panier'];
$_SESSION['panier'] ['produit'] = $_POST['produit'];
$_SESSION['panier'] ['quantite'] = $_POST['quantite'];
$_SESSION['panier'] ['prix'] = $_POST['prix_format'];
?>

Si le client n'est pas identifié avant d'ajouter au panier ça ne marche pas. Utilisation dans la requête Sql de $_SESSION['email']. Si j'efface [$i] dans le bout de script ci-dessous ça fonctionne mais je ne pourrais pas afficher d'autres articles :

for ($i=0 ;$i < $nbArticles ; $i++)

{
echo "<tr>";
echo "<td>".htmlspecialchars($_SESSION['panier']['produit'][$i])."</ td>";
echo "<td><input type=\"text\" size=\"4\" name=\"q[]\" value=\"".htmlspecialchars($_SESSION['panier']['quantite'][$i])."\"/></td>";
echo "<td>".htmlspecialchars($_SESSION['panier']['prix'][$i])."</td>";
echo "<td><a href=\"".htmlspecialchars("panier.php?action=suppression&l=".rawurlencode($_SESSION['panier']['produit'][$i]))."\">X</a></td>";
echo "</tr>";
}

Ca fait des jours et des jours que je tourne en rond. J'ai déjà posté sur ce sujet mais je n'ai toujours pas la solution. Help !!!


2) Je ne peux afficher plusieurs articles en même temps.

Si le client ajoute un article dans le panier, celui-ci apparaît (avec le problème cité ci-dessus) mais disparaît pour laisser place à l'autre article si le client en sélectionne un autre.

Même punition : Help !!!

Merci pour votre aide...
(P.S : je suis débutante en php)


4 réponses

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
11 août 2011 à 10:08
Bonjour,

Je lis: Si le client n'est pas identifié avant d'ajouter au panier ça ne marche pas

Mon avis: ce serait plus simple de faire un panier directement en base de données...

Le problème avec les sessions, c'est qu'elles ont une durée de vie limitée. Donc, si le client tarde trop, les données s'effacent. En gérant vos paniers en BDD, c'est plus persistant. Scénario:
- le client s'identifie,
- on vérifie s'il n'a pas une commande en cours. S'il n'en a pas, on crée une commande...
- dès qu'il sélectionne un produit, on crée une ligne produit rattachée à cette commande,
- en fin de commande, on peut facilement retrouver tous les produits rattachés à cette commande...

En annexe, vous créez un script qui vire toutes les commandes non validées trop anciennes (+48 à 72 heures...).

C'est pas compliqué.

A+
0
Utilisateur anonyme
11 août 2011 à 10:23
Bonjour,

Votre code d'enregistrement du produit dans le panier ne peut effectivement enregister qu'un seul produit, il faudrait mettre ceci :

<?php
$_SESSION['panier'] ['produit'][] = $_POST['produit'];
$_SESSION['panier'] ['quantite'][] = $_POST['quantite'];
$_SESSION['panier'] ['prix'][] = $_POST['prix_format'];
?>

C'est pour cela que quand vous demandez $_SESSION['panier']['quantite'][$i] il vous affiche le premier carractère.
Dans votre système $_SESSION['panier']['quantite'] est une chaîne donc $_SESSION['panier']['quantite'][0] est le premier caractère de cette chaîne.

Pour votre boucle for ($i=0 ;$i < $nbArticles ; $i++) il serait mieux de mettre for ($i=0 ;$i <count($_SESSION['panier'] ['produit']) ; $i++) à la place. count($_SESSION['panier'] ['produit'] vous donne le nombre d'éléments présent dans le tableau.

Après je en sais pas pour quelle raison le panier ne fonctionne pas si le client n'est pas enregistré et je n'ai pas compris ce que vous vouliez dire par Utilisation dans la requête Sql de $_SESSION['email'].

Cordialement
0
Bonjour et merci pour vos réponses.

J'ai en effet essayé :

<?php
$_SESSION['panier'] ['produit'][] = $_POST['produit'];
$_SESSION['panier'] ['quantite'][] = $_POST['quantite'];
$_SESSION['panier'] ['prix'][] = $_POST['prix_format'];
?>

mais à chaque fois il me note :

Fatal error: [] operator not supported for strings in C:\wamp\www\album_photos\panier.php on line 6

Pour ce qui est du fait que le panier ne fonctionne pas quand le client ne s'identifie pas ça correspond à ma volonté que le client soit reconnu avant de faire son panier. Ca marche très bien de ce côté la. J'ai ajouté dans ma requête Sql une condition.
0
$_SESSION['panier'] ['produit'][] = $_POST['produit'];
0
Utilisateur anonyme
11 août 2011 à 10:50
Il y a quoi en ligne 6 ?
0
Il y a $_SESSION['panier'] ['produit'][] = $_POST['produit'] ;
0
Utilisateur anonyme
11 août 2011 à 10:55
Ok c'est un problème d'initialisation quelque part avec les trois variables

$_SESSION['panier'] ['produit'];
$_SESSION['panier'] ['quantite'];
$_SESSION['panier'] ['prix'];

Tu dois mettre quelque part dans ton code
$_SESSION['panier'] ['produit'] = une chaîne
alors qu'en fait à l'initialisation de ton panier la première fois tu fois mettre
$_SESSION['panier'] ['produit'] = array();
idem pour les autres.
0
Youpi ça marche !!
Mais il reste toujours le problème de l'affichage d'un élément à la fois ??
J'ai bien remplacé for ($i=0 ;$i < $nbArticles ; $i++) par for ($i=0 ;$i <count($_SESSION['panier'] ['produit']) ; $i++) mais pareil ???
0
J'ai oublié de préciser que lorsque je souhaite supprimer un élément du panier et/ou que je clique sur l'onglet panier il me met des messages d'erreurs m'indiquant que les variables produit, quantite... ne sont pas renseignées. C'est comme ci le panier et la bdd n'était pas connectés ???
0
Est ce que le problème pourrait venir du fait que je n'ai pas inséré dans mon formulaire ce bouton soumis par le créateur du script :


<a href="panier.php?action=ajout&l=LIBELLEPRODUIT&q=QUANTITEPRODUIT&p=PRIXPRODUIT" 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 au panier</a>
0
Utilisateur anonyme
11 août 2011 à 14:09
>Mais il reste toujours le problème de l'affichage d'un élément à la fois ??

Tu peux m'expliquer plus clairement le problème ?

La boucle for permet d'afficher tous les éléments présent dans le panier, ce n'est pas ce que veux faire ?

Pour la suppression d'un élément, peux-tu me montrer le code ?
0
Oui malheureusement il n'affiche toujours qu'un élément à la fois.

En effet je n'ai peut être pas été très claire.
Alors deux véritables problèmes se posent et je pense qu'ils sont liés :

1) le panier n'affiche qu'un élément à la fois

Je clique dans mon catalogue sur le bouton "ajouter au panier" et ça s'affiche correctement et si je veux un deuxième article dans le panier, je dois revenir sur le catalogue (pas de lien direct) et refaire "ajouter au panier". Et le panier ajoute le dernier article saisi. Pas les deux ???

2) Quand je clique sur la croix pour supprimer un élément dans le panier il m'indique que les variables ne sont pas définies. Alors il y a ce bout de script dans la page panier.php :

if (!$erreur){
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']['produit'][$i],round($QteArticle[$i]));
}
break;

Default:
break;
}
}

et la fonction dans la page fonction-panier.php :

<?php
function supprimerArticle($produit){
//Si le panier existe
if (creationPanier() && !isVerrouille())
{
//Nous allons passer par un panier temporaire
$tmp=array();
$tmp['produit'] = array();
$tmp['quantite'] = array();
$tmp['prix'] = array();
$tmp['verrou'] = $_SESSION['panier']['verrou'];

for($i = 0; $i < count($_SESSION['panier']['produit']); $i++)
{
if ($_SESSION['panier']['produit'][$i] !== $produit)
{
array_push( $tmp['produit'],$_SESSION['panier']['produit'][$i]);
array_push( $tmp['quantite'],$_SESSION['panier']['quantite'][$i]);
array_push( $tmp['prix'],$_SESSION['panier']['prix'][$i]);
}

}
//On remplace le panier en session par notre panier temporaire à jour
$_SESSION['panier'] = $tmp;
//On efface notre panier temporaire
unset($tmp);
}
else
echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}
?>

Voilà j'espère avoir été plus claire...
As tu besoin du script complet pour avoir une vision d'ensemble ?
0