taxitat
Messages postés38Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention18 mars 2009
-
16 mars 2009 à 14:52
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009
-
18 mars 2009 à 14:54
Bonjour à tous,
J'essaye de créer un panier d'achat. J'en suis au stade expérimental et pour ne pas me casser la tête, à ce stade je "remplis" mon panier à travers un formulaire.
Pour faire plus simple, je vous écris et vous commente mon code:
<?php
session_start(); //démarrage de la session
$ref = $_POST['item']; //Je recupère les données de mon formulaire
$qte = $_POST['qte'];
//Création du caddie
if (!empty($_SESSION['panier'])){} //Si le 'panier' n'est pas vide, ne rien faire
else //Par contre, si le 'panier' n'existe pas, je le crée
{
$_SESSION['panier']=array(
'refProduit' => $ref,
'qteProduit' => $qte);
}
//je cherche dans le 'panier' si le produit est déjà dedans
$positionProduit = array_search($ref, $_SESSION['panier']);
//On reagarde si l'article existe déjà si oui on augmente sa qantité dans le panier
if ($positionProduit !== false){
$_SESSION['panier'][$positionProduit] += $qteProduit ;
}
//sinon on l'ajoute
else {
array_push( $_SESSION['panier']['refProduit'],$ref);
array_push( $_SESSION['panier']['qteProduit'],$qte);
}
//je visualise mon panier pour vérifier que mon code marche
echo '';
print_r($_SESSION['panier']);
echo '
';
//J'ai une petite sortie pour voir ce que j'ai envoyé
echo $ref. ' j\'en veux '. $qte;
?>
A ce stade, voilà que j'ai deux problèmes:
1. print_r m'affiche refProduit=>0 (quand ça devrait être toute autre chose) et ce, même si je mets un simple $ref ='Un test';
2. Si je renvois mon formulaire, la dernière ligne m'envoie bien ce que j'ai posté, mais print_r ne m'affiche que la 1e entrée Donc, je crois que ça n'enregistre rien dans mon array.
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009 16 mars 2009 à 16:44
Alors je pense qu'il y a confusion entre les array et les valeur ... Deja pour commencer tu peux enlever le name ="qte" sur les options de ton select ... ça fait conflit avec le select actuellement.
Ensuite, ici :
if (!empty($_SESSION['panier'])){} //Si le 'panier' n'est pas vide, ne rien faire
else //Par contre, si le 'panier' n'existe pas, je le crée
{
$_SESSION['panier']=array(
'refProduit' => $ref,
'qteProduit' => $qte);
}
$_SESSION['panier']['refProduit'] est une string ... et plus loin dans ton code tu fais ça :
array_push( $_SESSION['panier']['refProduit'],$ref);
ce qui signifierait que ton $_SESSION['panier']['refproduit'] est un array ... Il y a donc un conflit dans les données ...
De plus, quand tu fais ça :
$positionProduit = array_search($ref, $_SESSION['panier']);
Il ne me semble pas que le array_serach est récursif (c'est à dire qu'il n'ira pas regarder dans chacun de tes array contenu dans ta session panier .. IL ne lira que dans le panier et non pas dans panier => refProduit et panier => qteProduit).
Je te suggère donc de revoir la déclaration de tes variables de session lors de la création de ton 'caddie'
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009 17 mars 2009 à 10:26
C'est parce que $_SESSION['panier']['refProduit'] n'est pas un array :D
Cela vient surement du fait que ton test d'initialisation de ton panier n'est pas bon ... Essai de remplacer :
if (!empty($_SESSION['panier'])){}
else
{
$_SESSION['panier']=array();
$_SESSION['panier']['refProduit']=array();
$_SESSION['panier']['qteProduit']=array();
}
Si tu penses t'en sortir comme ça tu peux rester dans cette optique mais je trouve ceci pas très "parlant". J'aurais plutôt fait comme un truc comme ça :
Disons que comme ça tu accède à toutes les infos de ton produit en passant par un seul tableau ... Parce que fais comme tu la fais, tu doit récupérer la position pour accéder aux infos dans 2 tableaux différents ... Je sais pas si je me fais bien comprendre
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009 17 mars 2009 à 12:31
Oui ça va modifier un peu ton code. Tu va avoir un truc dans le style :
au lieu de récupérer dans des variables tes posts ... tu y récupère dans un tableau :
$tmp = array();
$tmp['qteProduit'] = $_POST['qteProduit'];
$tmp['refProduit'] = $_POST['item'];Et ensuite ton array_push se fera de la sorte :
array_push($_SESSION['panier'],$tmp);
Vous n’avez pas trouvé la réponse que vous recherchez ?
Pour ton cas si tu fais par exemple :
search_in_array("objet2", $_SESSION['panier'])
et bien ça va te retouner ceci :
array(1) {
[1]=> //ici la position
array(1) {
[0]=>
string(3) "refProduit" //et ici l'endroit dans lequel est stocké ta valeur
}
}
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009 17 mars 2009 à 16:36
ton print_r est correct ... simplement, au lieu d'utiliser le
array_search que tu utilisais et bien utilise la fonction que je t'ai
mis ...Elle te retourne un tableau (comme je te l'ai mis) qui contient
la position ainsi que l'endroit dans lequel est stocké ta valeur
recherchée ...
Tu doit donc faire un truc comme ça :
$positionProduit = key(search_in_array("objet2", $_SESSION['panier'])) //sa te retourne un chiffre ou false
La fontion key te retourne la clé d'un tableau ... Ici la fonction search_in_array te retourne un tableau contenant toute les infos dont tu as besoins.
taxitat
Messages postés38Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention18 mars 20091 16 mars 2009 à 16:31
Merci de ta réponse.
Voici mon code html:
$reponse = mysql_query("SELECT * FROM favors WHERE id='.$id.') or die(mysql_error());
while ($donnees = mysql_fetch_array($reponse) )
{
$name=$donnees[name];
};
echo '';
echo '[javascript:document.getElementById(\'formulaire\').submit() ajouter au panier]</form>';
J'ai mon catalogue dans une bdd "favors" où je choisis une réf ("$id")
Bref, pour l'instant c'est sommaire mais je suis de l'avis d'y aller pas à pas et que si ça marche à ce stade ça marcher plus tard.
Ce que je ne comprends pas c'est que la dernière ligne de mon code php (echo $ref et $qte j'obtiens bien ce que j'avais rentré mais visiblement ça ne s'enregistre pas dans mon array. :(
//Création du caddie
if (!empty($_SESSION['panier'])){}
else
{
$_SESSION['panier']=array();
$_SESSION['panier']['refProduit']=array();
$_SESSION['panier']['qteProduit']=array();
}
//A présent, je crois que ce sont des arrays
//Je cherche dans le tableau session si le produit existe déjà
$positionProduit = array_search($ref, $_SESSION['panier']);
//Si je mets $_SESSION['panier']['refProduit'] ça me donne une erreur "wrong data type for second argument"
//On reagarde si l'article existe déjà si oui on augmente sa qantité dans le panier
if ($positionProduit !== false){
$_SESSION['panier'][$positionProduit] += $qteProduit ;
}
//sinon on l'ajoute
else { //array_push() empile un ou plusieur éléments à la fin d'un tableau
array_push( $_SESSION['panier']['refProduit'],$ref);
array_push( $_SESSION['panier']['qteProduit'],$qte);
}
//Dans les deux cas, j'obtiens un message: First argument should be an array (je croyais que c'était fait plus haut (!)
echo '';
print_r($_SESSION['panier']);
echo '
';
echo $ref. ' j\'en veux '. $qte;
?>
Bref, après avoir jetté un coup d'oeil au manuel, je me demande si avec un if(in_array) ce ne serait pas plus simple...
Qu'en penses-tu?
taxitat
Messages postés38Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention18 mars 20091 17 mars 2009 à 10:59
Mike1310, Merci bcp de ta réponse. J'avais modifié mon code comme suit:
<?php
session_start(); //démarrage de la session
$ref = $_POST['item']; //récupération des données postées
$qte = $_POST['qteProduit'];
//Création du caddie
if (!empty($_SESSION['panier'])){}
else
{
$_SESSION['panier']=array();
$_SESSION['panier']['refProduit']=array();
$_SESSION['panier']['qteProduit']=array();
}
//Ajout nouveau produit
if (in_array ($ref, $_SESSION['panier']['refProduit'])){ //Si l' produit existe déjà => augmenter la quantité
$_SESSION['panier']['refProduit'][$ref] += $qte;
}
else { //S'il n'existe pas => ajouter la nouvelle entrée
array_push($_SESSION['panier']['refProduit'],$ref);
array_push($_SESSION['panier']['qteProduit'],$qte);
}
echo ''; //On visualise le tableau
print_r($_SESSION['panier']);
echo '
';
?>
Cela a l'air de bien marcher dans le cas d'un nouvel ajout mais pas dans le cas de vouloir rajouter des indices à un produit déjà existent.
Je pense que là je commence quand même la phase 2, à savoir, pouvoir modifier et/ou supprimer un article. Je crois que ce n'est plus qu'un problème de arrays à présent. ça a peut être l'air facile pour certains, mais vu que c'est des tableaux à 2 dimensions, je galère un peu (dsl, je suis debutant)
Cependant ton array isset me plait bien aussi (c'est à dire, si ça existe ok, sinon, crée-le)
Encore merci de m'éclairer avec ton avis. C'est tjrs sympa d'avoir une 2e opinion et une autre façon de voir les choses.
taxitat
Messages postés38Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention18 mars 20091 17 mars 2009 à 11:15
Bon, mon code avance!
Je n'arrivais pas à ajouter une qté à un article déjà existant. J'ai fait ceci:
//Ajout nouveau produit
$positionProduit = array_search($ref, $_SESSION['panier']['refProduit']);
if (in_array ($ref, $_SESSION['panier']['refProduit'])){ //Si l' produit existe déjà => augmenter la quantité
$_SESSION['panier']['qteProduit'][$positionProduit] += $qte;
}
else { //S'il n'existe pas => ajouter la nouvelle entrée
array_push($_SESSION['panier']['refProduit'],$ref);
array_push($_SESSION['panier']['qteProduit'],$qte);
}
et à prsent ça marche!!
Bref, passons à la "phase 2" (supprimer ou modifier des quantités)
cs_mike1310
Messages postés232Date d'inscriptionjeudi 30 août 2007StatutMembreDernière intervention31 juillet 2009 17 mars 2009 à 11:28
Est ce que tu peux me montrer ce que t'affiche ton var_dump de ta Session panier please ... parce qu'a mon avis tu risques d'avoir plsu tard des problèmes de compréhension et surtout d'organisation
taxitat
Messages postés38Date d'inscriptionmercredi 28 novembre 2007StatutMembreDernière intervention18 mars 20091 17 mars 2009 à 12:11
Ah oui, je comprends tout à fait! ça me semble mieux et plus facile.
Par contre, comment faire??? Est-ce que ça va changer qqch aux opérations que j'ai jusqu'à maintenant?
Est-ce que si je fais un simple $_SESSION['panier'][$i] (un truc dans le genre) ça ne marchera pas?
Car là, je sèche complètement!
De plus, je crois que je vais rajouter une 3e variable à mon tableau: le prix!
Jusqu'à présent, j'utilisais $positionProduit pour savoir dans quel array se trouvait ce que je cherchais et pouvoir l'appeller facilement. Il renvoyait un chiffre ou bien false s'il n'avait pas trouvé. D'où je sortais $_SESSION['panier'][$positionProduit] J'espère que je m'explique clairement...
Bref, je pense que d'ici ce soir tu auras un nouveau message de moi (LOL) que soit soit pour pleurer que je ne me'n sors pas ou bien pour dire que c'est résolu!