Modifier la quantité en stock apres une commande (PHP/Mysql)

Eléphant du PHP | 50 Messages

03 mai 2008, 19:36

Bonjour,

Encore et toujours moi :lol:
On arrive au bout du tunnel avec mon projet.

Donc ce que je voudrais ( et que je n'arrive pas à faire) c'est que lorsque je valide mon panier avec le script envoi_cde.php il enregistre ma commande et que la quantité en stock de ma table produit diminue en fonction du numéro produit (nump) et de la quantité de la commande.

Voici mon envoi_cde.php:
$date=date("Y-m-d");

$requete1="INSERT INTO commande (numero_cde,statut,datecdecl,num_cli_cde) VALUES ('','En attente','$date','$numero')"; //ajout de la commande dans la table commande
mysql_query($requete1) or die ("Requête1 impossible".mysql_error());//exécution de la requête

                
  $num_cde=mysql_insert_id();
  
foreach( $_SESSION['panier']['id_prod'] as $key=>$value ) {

  $aInsert[]="('".$value."','".$num_cde."',".$_SESSION['panier']['qteProduit'][$key].")"; 
} 
  



$sInsert = implode(',',$aInsert);

$requete2 = "insert into ligne_commande (num_prod, num_cde, qte_cde) values". $sInsert; //ajout des articles et quantité dans la table ligne_commande
mysql_query($requete2) or die ("Requête2 impossible".mysql_error());//exécution de la requête
C'est juste la partie actuelle, j'ai enlevé mes essais car c'était foireux et ca fera plus propre comme ca..
Peut-être que ca rappelle des souvenirs à certains ^^ donc cette partie sert à envoyer la commande à la bdd et fonctionne parfaitement.


Pour modifier la quantité j'ai bien pensé à faire une requete:

Code : Tout sélectionner

update produit set qtestockp="qtestockp-$_SESSION['panier']['qteProduit'][$key]" where nump="$value";
Enfin quelque chose comme ca car j'ai essayer tout ce que j'imaginais..
Parfois mon stock passait à 0.

Je n'ai jamais utiliser update en cours mais j'ai quand même réussi à l'utiliser pour changer le statut d'une commande pour une autre page, mais là c'est trop compliquer..

La rentrée est lundi il faudrait que j'ai bouclé ca dans la mesure du possible..
Donc je sollicite votre aide une fois de plus.. :roll:

Merci si vous voulez bien m'aider.
Cdlt

Mammouth du PHP | 693 Messages

03 mai 2008, 19:44

Code : Tout sélectionner

update produit set qtestockp="qtestockp-$_SESSION['panier']['qteProduit'][$key]" where nump="$value";
A la base l'idée est bonne. Seulement, qtestockp est une colonne et non une chaine. IL faut donc la sortir des double quote.

D'autre part, les opération mathématique ne fonctionne qu'avec les champs contenant des nombre. Il n'y a donc pas besoin de doublequote.

Ceci aurait plus de chance de marcher

Code : Tout sélectionner

update produit set qtestockp=qtestockp-$_SESSION['panier']['qteProduit'][$key] where nump="$value"

Eléphant du PHP | 50 Messages

03 mai 2008, 20:29

Bonjour!

Merci de ton aide!

Alors là j'ai deux problèmes:

1) la variable $_SESSION['panier']['qteProduit'][$key] pose problème car il me retourne un :

Code : Tout sélectionner

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
2) Si je remplace la variable par 1 pour tester quand même la requete, elle me change bien ma quantité pour le bon produit mais par contre si j'ai plusieurs produits dans mon panier, ca ne modifie la quantité que pour le dernier produit de mon panier :S


Voici le code actuel:
$date=date("Y-m-d");

$requete1="INSERT INTO commande (numero_cde,statut,datecdecl,num_cli_cde) VALUES ('','En attente','$date','$numero')"; //ajout de la commande dans la table commande
mysql_query($requete1) or die ("Requête1 impossible".mysql_error());//exécution de la requête

                
  $num_cde=mysql_insert_id();
  
foreach( $_SESSION['panier']['id_prod'] as $key=>$value ) {

  $aInsert[]="('".$value."','".$num_cde."',".$_SESSION['panier']['qteProduit'][$key].")"; 
} 
  



$sInsert = implode(',',$aInsert);

$requete2 = "insert into ligne_commande (num_prod, num_cde, qte_cde) values". $sInsert; //ajout des articles et quantité dans la table ligne_commande
mysql_query($requete2) or die ("Requête2 impossible".mysql_error());//exécution de la requête



$requete3= "UPDATE produit SET produit.qtestockp=qtestockp-1 WHERE nump=\"$value\"";
mysql_query($requete3) or die ("Requête3 impossible".mysql_error());//exécution de la requête
La requete est la requete 3.

Voilà les nouvelles :roll:

Comme tu as pu le constater je suis un gros débutant donc j'y vais doucement :wink:

Merci beaucoup!

Je vais continuer à chercher et faire des erreurs en attendant vos idées

Cordialement

Mammouth du PHP | 693 Messages

03 mai 2008, 20:54

Comme c'est un tableau, il faut le mettre en accolade pour signifier explicitement le début et la fin du nom de la variable s'il est dans une chaine. Autre méthode, le sortir de la chaine et utiliser des concaténations

En gros, ca donne :
"un texte {$array[$key]} un autre texte"
//ou
"un texte ".$array[$key]." un autre texte"
Cela dit, je préfère la deuxième méthode, qui permet d'avoir une séparation visuel entre les chaines "brutes" qui ne change pas et les variables, lorsqu'on utilise la coloration syntaxique. Mais après, ce n'est qu'une question de gout.


De plus, comme tu veux faire une mise à jour pour chaque élement du panier, il faut mettre ta mise à jour de tes stock dans le foreach.

Eléphant du PHP | 50 Messages

03 mai 2008, 21:08

Ah c'est bon ca fonctionne!
Je n'aurais jamais pensé à faire ca.. :roll:
En fait ce n'était pas si sorcier, j'ai vraiment du mal avec la boucle foreach :S


Je vais mettre ce sujet en résolu.

Merci beaucoup orgerix tu as été rapide et précis c'était super sympa!

Bonne soirée

Cordialement

Mammouth du PHP | 693 Messages

03 mai 2008, 21:13

En fait ce n'était pas si sorcier, j'ai vraiment du mal avec la boucle foreach :S

Il faut à chaque fois tu poser la question : est ce une tache unique ou doit elle être répété.

SI elle dois être répété, tu dois obligatoirement utiliser une boucle. Suivant la nature de la tache et sur quoi elle porte, tu utilisera différentes boucles.

En gros et très schématiquement :
  • Si la tache porte sur les élement d'un tableau, foreach est le plus adapté
  • Si tu dois faire la tache un nombre de fois connu à l'avance, dans ce cas, c'est for le plus adapté
  • Enfin, dans les cas restants, généralment, tu dois faire une tache temps qu'il y a certaines conditions. Dans ce cas, c'est while qui est le plus adapté

Eléphant du PHP | 50 Messages

03 mai 2008, 21:38

D'accord j'en prends bonne note :wink:

J'essaierais d'avoir cette automatisme avec le temps. :roll:

Merci encore!