[PHP] pb de array pour un caddie virtuel

:stuck_out_tongue:

bon je demande conseille pour mon caddie car je n’arrive pas gerer le cas ou l’on selectionne 2 fois de suite le meme produits ds des quantité differentes ou egales :heink:

Voila le resultat de mon caddie apres avoir selectionné un produit (=id) et sa quantité correspondante(qte).
Comme vous pouvez le voir, le produit id=2 a été selectionné une seconde fois et je cherche a additionner ce produit ds mon tableau.
Je suppose que array_search et foreach doivent etre utilisés mais je n’y arrive pas :cry:.
[cpp]
Array
(
[0] => Array
(
[id] => 2
[qte] => 3
)

[1] => Array
    (
        [id] => 4
        [qte] => 1
    )

[2] => Array
    (
        [id] => 2
        [qte] => 9
    )

)
[/cpp]
Il faut que pour le meme produit il additionne les quantités :fou:
Le code correspondant au resultat si dessus cad celui de caddie.php.
[cpp]<?php

if ($_POST[‘ajout’] == “ajout”)
{
if (isset($_POST[‘id’]))
{
$_SESSION[‘achats’][] = array(“id” => $_POST[‘id’], “qte” => $_POST[‘quantite’]);
echo ’


';
print_r($_SESSION[‘achats’]);
echo ’

';
}
}
?>
[/cpp]

et voici le code appliqué pour afficher les produits (articles.php).
Il affiche les produits selon la categorie choisie par l’utilisateur.(ca marche tres bien ca :smiley: ).

[cpp] <?php
//On recupere l’Id de chaque produit
$queryID=mysql_query(“select id, cat, ref, prix from galerie where Id=’”.$AfficheGalerie[‘id’]."’");
$InfoProd=mysql_fetch_array($queryID);
?>






Quantit&eacute; :


1
2
3
4
5
6
7
8
9




[/cpp]

Bon j’espere avoir donné toutes les infos qu’il fallait, je continue la quete du “graal” :bounce:

Merci par avance pour vos reponses pertinentes [:siffle] :wink:
:jap: [:vovin42]

perso je ferais différemment.

dans le tableau tu met

Array (
[num_article] => qte
)

et ensuite

[cpp]#

// avec $tab ton tableau d’articles

if ($_POST[‘ajout’] == “ajout”)

{

if (isset($_POST[‘id’]))

{

if(isset($tab[$_POST[‘id’]])) {

$tab[$tab[$_POST[‘id’]] += $_POST[‘quantite’];
} else {
$tab[$tab[$_POST[‘id’]] = $_POST[‘quantite’];
}

}

}[/cpp]

(désolé les #, c’est le copier-coller :/)

Sinon tu as array_search.

moi deja je gererais le caddie en cookie because ça chargerait moins le serveur que des variables de session…

c sur si t as pas des milliers de clients… mais tant qu a faire les choses autant les faire de maniere optimale

en plus ça permet de garder le caddie indefiniment sur le post du client :confused:

pour les cookies, tout depend aussi des utilisateurs qui doivent les accepter donc je prefere pas :wink:

J’ai testé avec le array_search mais je n’y arrive pas :frowning:

Ca menerve je sens que la solution est proche mais pas moyen:d

–>Sans-Nom:
pourrais tu m’indiquer la syntaxe de l’array serch avec mon double tableau svp? :jap:

–>NeqO
je teste tes idées ce WE car la je n’est pas le temps :wink:

c pareil avec les session faut que le client accepte le cookie de session… ou alors faut passer le phpsessid dans toutes tes url …

bon j’ai testé vite fait avant de partir ton code NeqO :d :
deja il manque un ] ds ton code mais pas grave :d
Sinon il ne donne que des erreurs ton code [:______]

ça doit marcher

[:______]

voila comment je gere ca et cela marche tres bien :

  • utilisation cookie pour gerer le compte client durant sa session avec redirection sur une page alerte si le client refuse les cookies

[cpp]
//creation du selecteur
$liste =’’;
$liste .=’’.$qte.’’; //$qte valeur que j’ai recupere precedement dans mon code
for ($k = 1 ; $k < 21 ; $k++ ){
$liste .= ‘’.$k.’’;
}
$liste .=’’
// La fonction strip_tags est utilisé lors de l’affichage du SID dans le but de contrer les attaques XSS.
[/cpp]

[cpp]
session_start();
//suppression de l’ancienne qte
for ($i=0 ; $i < count($_SESSION[‘achats’]) ; $i++){
if ($_SESSION[‘achats’][$i][‘id’] == $_GET[“id”] ){
array_splice($_SESSION[‘achats’], $i, 1); //tu peut ajouter directement le nouvell array ici mais chez moi cela a pose des pb donc j’ajoute le nouvel array ensuite
}
}
//ajout de la nouvelle qte
$_SESSION[‘achats’][] = array (“id” => $_GET[‘id’], “qte” => $_GET[‘new_qte’]);
//redirection
header(“location:index.php?r=caddie&”.strip_tags(SID));
[/cpp]
Fonction array_splice :
array_splice – Efface et remplace une portion de tableau
http://fr.php.net/manual/fr/function.array-splice.php

et pour recupere tout cela :

[cpp]for ($i=0; $i < count($_SESSION[‘achats’]); $i++){
$id_produit = $_SESSION[‘achats’][$i][‘id’];
$qte = $_SESSION[‘achats’][$i][‘qte’];
…//reste de ton code
}
// ->confirmation de commande
// ->compte client
// ->paiment en ligne ou autre
// ->generation en du bon de commande / facture en pdf et envoie par email a la societe,generation d’un id de maj et connextion au serveur dela societe pour inserer la commande, un sms au patron pour le prevenir de la commande, et un email au client pour lui indiquer un lien pour dl sa facture avec un id unique sur la facture(fonction srand sur 15 car.)

voila le process que j’utilise (en ayant simplifier :=) )
[/cpp]

je ne peut mettre un lien de site directement sinon pub
si tu veut le lien je te l’envoi par mp que tu voie le resultat final

je regarderais ton code thx :wink:
mais bon ca m’enerve de pas trouver la soluce a mon pb :frowning:

edit: bon ton code est un poil audessus de mes competences pour le moment :d surtt la 1ere partie //creation du selecteur )
donc je ne vois pas comment adapter ca a mon code :??:

sinon ca progresse (dsl NeqO j’avais fait une erreur en reprenant ton code) :
Je suis pas loin de la soluce pour mon pb a mon avis.
Donc je choisi le produit A(id=2) avec 1 comme quantite.
Je clik sur mon chti chariot.
Puis je reviens au catalogue, re-choisi le me produit mais avec 9 quantité.Je reclik sur mon chti chariot :d et voila le result de mon caddie :
[cpp]Array
(
[0] => Array
(
[id] => 2
[qte] => 1
)

[2] => 1
[3] => Array
    (
        [id] => 2
        [qte] => 9
    )

)[/cpp]
Le “truc” c’est qu’il faut ajouter un autre produit pour que la somme soit faite ds le tableau.Cad je choisi un autre produit au pif et je clik sur le chariot, j’obtient ca:
[cpp]Array
(
[0] => Array
(
[id] => 2
[qte] => 1
)

[2] => 10   --->>>>on obtient alors la "somme"
[3] => Array
    (
        [id] => 2
        [qte] => 9
    )

[4] => Array  ------->mais bon on a un article en trop :d
    (
        [id] => 7
        [qte] => 1
    )

)
[/cpp]

Voici le code php :
[cpp]$_SESSION[‘achats’][] = array(“id” => $_POST[‘id’], “qte” => $_POST[‘quantite’]);
if ($_POST[‘ajout’] == “ajout”)
{
if(isset($_SESSION[‘achats’][$_POST[‘id’]]))
{
echo ’


';
print_r($_SESSION[‘achats’]);
echo ’

';
echo ‘1er if’;
$_SESSION[‘achats’][$_POST[‘id’]] += $_POST[‘quantite’];
}
else
{
echo ’

';
print_r($_SESSION[‘achats’]);
echo ’

';
echo ‘2eme else’;
$_SESSION[‘achats’][$_POST[‘id’]] = $_POST[‘quantite’];
}
}
[/cpp]
reste a trouve a ne pas avoir besoin d’ajouter un produit pour faire la “somme” a afficher [:paysan]

BUG:
apres un test rapide:
achat produit A X1
produit A X9
pruduit B X1

resultat:
Fatal error: Unsupported operand types in c:\program files\easyphp1-7\www\include\caddie.php on line 53

Il aime pas ca :
$_SESSION[‘achats’][$_POST[‘id’]] += $_POST[‘quantite’];

essaye cela pour ton code :

[cpp]
if ($_POST[‘ajout’] == “ajout”){
//on parcours toute la sessions a la recherche de la ligne contenant l’id produit existant
for ($i=0 ; $i < count($_SESSION[‘achats’]) ; $i++){
if ($_SESSION[‘achats’][$i][‘id’] == $_POST[“id”] ){
array_splice($_SESSION[‘achats’], $i, 1);
}
}

//ajout de la nouvelle qte
$_SESSION[‘achats’][] = array (“id” => $_POST[‘id’], “qte” => $_POST[‘quantite’]);
}

[/cpp]

dans mon code voici comment l’expliquer :
j’ai un produit A avec une qte de 1 et un id X
dans mon panier je modifie la qte desiré a 5
je valide mon formulaire
je declare $i à 0
la ligne $i < count($_SESSION[‘achats’]) me permet de dire que tant que $i est inférieur au nombre de array present dans la session on rentre dans la boucle pour execution de la commande array splice

la ligne :
($_SESSION[‘achats’][$i][‘id’] == $_POST[“id”] ) donnera (pour exemple)
($_SESSION[‘achats’][$i][‘X’] == $_POST[“X”] )
si l’element $i correspond au tableau du produit A

alors on appel la fonction array_splice qui va supprimer tous le tableau de la session

puis ensuite il ne reste plus qu’a insere les nouvelle valeurs de la sessions avec les infos de ton formulaire
$_SESSION[‘achats’][] = array (“id” => $_POST[‘id’], “qte” => $_POST[‘quantite’]);

procede un peu bizzare je reconnais mais cela fonctionne
avant j’utilisais une classe caddie mais plus lourde a mettre en oeuvre et deployer
le temps d’execution est tres rapide apres il est vrai que je n’ai pas tester sur un catalogue de 10 000 produits non plus mais la tu passe par un autre systeme de gestion plus elabore a l’aide classe caddie

Pour le select :
combinaison javascript + php

1- creation d’un select avec changement automatique et redirection url
$liste => creation d’une variable select qui contiendra mon selecteur

2- le onchange est la fonction qui va declencher l’action (valeur de l’option selectionne, dans mon cas un lien avec les variable) lorsque je selectionne dans le selet la qte desire
le top.location la manier en javascript de designer un
choix_qte.options[choix_qte.selectedIndex].value => la un peu plus complexe c’est vrai mais simple en fait. je demande que la valeur du selecteur que j’ai nomme choix_qte soit la valeur a envoye via le form

OnChange="top.location=choix_qte.options[choix_qte.selectedIndex].value;

3- la c’est la qte (var=> $qte) que j’ai recupere dans la sessions qui est par defaut a 1 mais que l’utilisateur aura pu modifier auquel cas la valeur modifier sera apparente
$liste .=’’.$qte.’’;

4- la je decide que je veut seulement des qte de 1 à 20 qui s’affiche dans mon selecteur donc $k = 1 et tant que $k est inférieur à 21 alors on augmente $k de 1 a chaque jusqu’a que $k soit egal à 20
for ($k = 1 ; $k < 21 ; $k++ ){

5- la c’est les options
des que je selectionne une qte alors on est redirige automatiquement sur la page select.php avec r qui vaut qte (cf pseudo frame en php)
le &amp;(&) //norme w3c
strip_tags(SID) => transmission de l’id de session avec protection contre les attaques xss
la valeur new_qte est egal à la valeur de $k (soit de 1 à 20 max dans mon cas)
et pour que l’utilisateur voit j’affiche le $k

$liste .= ‘’.$k.’’

ce qui donne dans ton cas :
[cpp]
//page => select.php (exemple)
<?php

//On recupere l'Id de chaque produit
$queryID=mysql_query("select id, cat, ref, prix from galerie where Id='".$AfficheGalerie['id']."'");
         $InfoProd=mysql_fetch_array($queryID);            
//creation du select
$liste = '<form'>
$liste ='<select name="quantite" class="input" size="1" OnChange="top.location=quantite.options[quantite.selectedIndex].value;">';
$liste .='<option selected>'.$qte.'</option>'; //$qte valeur que j'ai recupere precedement qui correspond a la qte stocke dans la session pour l'id du produit   
for ($k = 1 ; $k < 10 ; $k++ ){  // dans ton cas je met 9 a la qte max 
	  $liste .= '<option value="caddie.php?MenuNumero=3&amp;amp;cat='.$InfoProd['cat'].'&amp;amp;id='.$InfoProd['id'].'&amp;amp;quantite='.$k.'&amp;amp;ajout=ajout&amp;amp;'.strip_tags(SID).'">'.$k.'</option>';//j'appelle la page caddie pour le traitement de la session apres a toi d'adapter a ton code
}
 $liste .='</select>'
 $liste .='</form>';
?>



// page => panier.php(exemple)
<?php
session_start();
include('select.php');

//…ton code
?>


Quantit&eacute; : //je te conseille plutot une feuille de style
S&eacute;l&eacute;ctionnez la quantit&eacute; : <?php echo $liste; ?>

//…ton code

//page caddie.php par exemple

<?php session_start(); $tmp = $_GET['ajout']; switch($tmp){ case "ajout" : //on parcours toute la sessions a la recherche de la ligne contenant l'id produit existant for ($i=0 ; $i < count($_SESSION['achats']) ; $i++){ if ($_SESSION['achats'][$i]['id'] == $_GET["id"] ){ array_splice($_SESSION['achats'], $i, 1); //suppresion du tableau contenant les ancienne valeur } } //ajout des nouvelle qte pour l'id $_SESSION['achats'][] = array ("id" => $_GET['id'], "qte" => $_GET['quantite']); //page de redirection avec un header par exemple suivi d'un exit(); header('location:tapage.php?var1=1&var2=2&'.strip_tags(SID)); exit(); //pour etre sur que le code en dessous ne sera pas interprete par le serveur en cas de petit pb //exemple de redirection avec l'id de sessions break; case "vider" : //exemple de vider le panier session_destroy(); //une redirection par ex comme ci dessus break; default : //page de redirection ou page erreur par exemple au cas ou un petit malin aurai essaye de changer la valeur ajout dans l'url ;) break; } //...reste de ton code ?>

[/cpp]

en utilisant cette methode il ne faut pas oublier de changer les parametre $_POST à $_GET
Perso je prefere distinguer le html du php plus lisible
voila j’espere avoir ete assez clair dans mes explications :wink:
a toi d’adapter tout cela a ton code :slight_smile:
attention le select en l’etat ne sera pas fonctionnel pour recupere tous tes id produits a toi de le mettre dans une boucle et de l’inserer dans ta page
la tu as tout le cheminement de page en page pour la modification des quantite
j’ai pas eu le temps de tester tous cela mais cela devrait fonctionner
si ca bug tien moi au courant il est 5 hr du mat j’ai peu etre fait une faute de frappe :wink:

je te remercie pour ton aide :oui: :jap:
mais j’ai beau tourner le code ds ts les sens pas moyen.

Perso j’utilise 2 page pour le caddie.
Ma page articles.php ou il s’affiche tous les articles selon la categorie :

http://lc2376.free.fr/divers/articles.jpg

et a chaque clique sur le chariot du produit, cava sur ma page caddie.php en affichant les données relatives au produit (pas mis en place mais pas dur) avec la qtité TJRS mis a jour de ce produit.

Ds ma page caddie, j’ai un lien qui renvoie au catalogue ou la personne continue a choisir articles par articles.
http://lc2376.free.fr/divers/caddie.jpg

Ds mon 1er post le 2eme code est celui (été :d) du caddie.php.

Le 3eme est celui de articles.php.

J’ai essayé ton code mais je galere :(.
Je pensé pas que cela serait si chiant car selon les forums certain dise qu’avec des variables sessions c’est assez simple [:______]

je continue a tester ton code et d’autres de mes tests :wink:

Si tu te sens de partir de mon code pour m’eguiller :jap:

Voila.Merci encore pour ton aide et celle des uatres participant.
On ne trouve pas de tuto sur un caddie virtuel de ce genre avec les sessions sur le net (du moins trouvé un tuto clair et sans les classes :frowning: ).

envoi tes pages sur mon mail
je tacherai demain de regarde ce qui peut deconner
et je posterai mon resulat ici que d’autre puisse en profiter ;=)
sdjinn@most-ik.com

cool c’est sympa.Je te reproduit l’architecture du site cad index.php + dossier ou il y a 2 pages include (caddie et articles) mais bon ca va etre chaud a tester car il va te manquer tte la base de données etc…
Je t’envoie ca desuite :jap:

Je continue a chercher de mon cote :d

pas de souci pour la base je la reconstruirai a partir de tes pages :slight_smile:
je regarde cela
des quej’ai une reponse je la poste ici

edit: je t’ai envoyer le script de genration de la base ca sera plus rapide pour toi :d :wink:

pour la base ca va vite j’ai recree une structure en partant de ta requete produit :slight_smile:

ok j’ai fait ton panier
je t’envoie les fichiers par email
et je poste ici le resultat