Conseil d'amelioration PHP/Mysql
poulap
-
kij_82 Messages postés 4260 Statut Contributeur -
kij_82 Messages postés 4260 Statut Contributeur -
Bonjour,
Je dois améliorer une partie d'un site internet, Kadolis.
Surtout la partie qui concerne les packs.
Je m'explique, Kadolis propose des Packs. Les Packs sont eux même des produits qui contiennent des options. Les options sont eux aussi des produits...
Par exemple le site propose des chambres de bébé donc une chambre est un produit qui elle même contient d'autre produits par exemple : un lit, une commode ect...
Cependant lorsqu'une chambre est vendue, le stock est bien décrémenté d'une chambre sauf que les options doivent être modifié manuellement dans le stock.
Il faudrait une solution lors du paiement de la commande, pour gérer tout le stock automatiquement.
Grâce à une boucle qui recherche les produits en fonction de leurs id et qui fait un UPDATE de la quantité a chaque fois.
En regardant le site et plus particulièrement la partie chambre de bébé, pouvez-vous me dire si vous voyez des améliorations a faire.
Pour une meilleure visibilité, pour gérer plus facilement les packs ?
http://www.kadolis.com/chambre_bebe_ch [...] -1-c2-89.html
site en php4, sgbd est phpmysql
Tout et n'importe quoi de constructif serait d'une grande aide pour moi...
Je vous remercie
Je dois améliorer une partie d'un site internet, Kadolis.
Surtout la partie qui concerne les packs.
Je m'explique, Kadolis propose des Packs. Les Packs sont eux même des produits qui contiennent des options. Les options sont eux aussi des produits...
Par exemple le site propose des chambres de bébé donc une chambre est un produit qui elle même contient d'autre produits par exemple : un lit, une commode ect...
Cependant lorsqu'une chambre est vendue, le stock est bien décrémenté d'une chambre sauf que les options doivent être modifié manuellement dans le stock.
Il faudrait une solution lors du paiement de la commande, pour gérer tout le stock automatiquement.
Grâce à une boucle qui recherche les produits en fonction de leurs id et qui fait un UPDATE de la quantité a chaque fois.
En regardant le site et plus particulièrement la partie chambre de bébé, pouvez-vous me dire si vous voyez des améliorations a faire.
Pour une meilleure visibilité, pour gérer plus facilement les packs ?
http://www.kadolis.com/chambre_bebe_ch [...] -1-c2-89.html
site en php4, sgbd est phpmysql
Tout et n'importe quoi de constructif serait d'une grande aide pour moi...
Je vous remercie
A voir également:
- Conseil d'amelioration PHP/Mysql
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Expert php pinterest - Télécharger - Langages
- Php alert - Forum PHP
- Retour à la ligne php ✓ - Forum PHP
29 réponses
Ok c'est bien ce que je pensais !
j'ai fait un bout de code qui tend vers la solution générale :
//COMMANDE d'un client d'une Chambre Bebe Childwood Country Stone Grey
/* Commode 3 tiroirs
Matelas TENCEL
Lit 60-120 */
//inserer chambre dans la table INCLUT
$inser1 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '530', '1', '1499')");
$inser2 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '526', '1', '40')");
$inser3 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '529', '1', '0')");
$inser4 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '221', '1', '0')");
$sel = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '12'");
for ($i=0; $i<("SELECT COUNT(*) FROM INCLUT WHERE Com_id ='12'"); $i++){
$row = mysql_fetch_array ($sel);
$up = "UPDATE products SET products_qt = products_qt -1 WHERE products_id = '".$row[$i]."'";
}
Donc j'ai ajouté tous les produits correspondant a une chambre dans la table INCLUT qui lie COMMANDE a PRODUIT.
Et ensuite je voulais defalquer le stock; a chaque itération faire un UPDATE de la quantité du produit un tel (en fonction de son id).
Mais ça a pas l'air de marcher.... Déjà est-ce une bonne méthode pour défalquer le stock ? ou faut t-il procéder autrement ? Et je n'arrive pas a trouver l'erreur que j'ai commise, si il y en a une !
j'ai fait un bout de code qui tend vers la solution générale :
//COMMANDE d'un client d'une Chambre Bebe Childwood Country Stone Grey
/* Commode 3 tiroirs
Matelas TENCEL
Lit 60-120 */
//inserer chambre dans la table INCLUT
$inser1 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '530', '1', '1499')");
$inser2 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '526', '1', '40')");
$inser3 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '529', '1', '0')");
$inser4 = mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '12', '221', '1', '0')");
$sel = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '12'");
for ($i=0; $i<("SELECT COUNT(*) FROM INCLUT WHERE Com_id ='12'"); $i++){
$row = mysql_fetch_array ($sel);
$up = "UPDATE products SET products_qt = products_qt -1 WHERE products_id = '".$row[$i]."'";
}
Donc j'ai ajouté tous les produits correspondant a une chambre dans la table INCLUT qui lie COMMANDE a PRODUIT.
Et ensuite je voulais defalquer le stock; a chaque itération faire un UPDATE de la quantité du produit un tel (en fonction de son id).
Mais ça a pas l'air de marcher.... Déjà est-ce une bonne méthode pour défalquer le stock ? ou faut t-il procéder autrement ? Et je n'arrive pas a trouver l'erreur que j'ai commise, si il y en a une !
Bonjour,
J'ai mis en place un bout de code qui permet de défalquer automatiquement le stock pour une commande donnée :
En utilisant que la table INCLUT et PRODUIT :
$id = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '12'");
while ($row = mysql_fetch_array ($id)) {
$qt = mysql_query("SELECT Quantite FROM INCLUT WHERE products_id = '".$row['products_id']."'");
while ($row1 = mysql_fetch_array ($qt)) {
$up = "UPDATE products SET products_qt = products_qt - (".$row1['Quantite'].") WHERE products_id = '".$row['products_id']."'";
mysql_query($up);
}
}
C'est normal que je n'utilise jamais la table COMPOSE pour défalquer ?
Elle me sert a rien dans ce cas la !
Parce que j'ai l'impression que ce code marche pour n'importe quelles commandes... Y'a un truc qui m'échappe ?
J'ai mis en place un bout de code qui permet de défalquer automatiquement le stock pour une commande donnée :
En utilisant que la table INCLUT et PRODUIT :
$id = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '12'");
while ($row = mysql_fetch_array ($id)) {
$qt = mysql_query("SELECT Quantite FROM INCLUT WHERE products_id = '".$row['products_id']."'");
while ($row1 = mysql_fetch_array ($qt)) {
$up = "UPDATE products SET products_qt = products_qt - (".$row1['Quantite'].") WHERE products_id = '".$row['products_id']."'";
mysql_query($up);
}
}
C'est normal que je n'utilise jamais la table COMPOSE pour défalquer ?
Elle me sert a rien dans ce cas la !
Parce que j'ai l'impression que ce code marche pour n'importe quelles commandes... Y'a un truc qui m'échappe ?
Hum, c'est ce que je t'ai expliqué un peu plus haut justement.
Ta base de données te sert à plusieurs choses:
- modéliser le lien entre les différents produits (via la table COMPOSE). Ce lien possède une quantité, mais attention, ce n'est qu'une quantité fixe non représentative du stock, elle est là pour dire : cet objet est composé de tant de cet autre objet (pour chaque objet qui le compose, ou que lui-même compose)
- représenter le stock réel des produits (via la table PRODUIT). La table PRODUIT comprend une quantité, qui elle reflète le nombre de produit en stock réel pour chacun des produits enregistré dans la base de données.
- enregistrer les commandes clientes (via la table COMMANDE et INCLUT). La table COMMANDE permet de symboliser la commande, la table INCLUT permet de faire le lien entre la commande elle-même, et les produits commandés pour cette commande. Il y aura donc autant de lien dans la table 'INCLUT' que de différent type de produit commandé dans une commande. La table INCLUT possède une quantité qui représente le nombre d'exemplaire d'un produit commandé. En aucun cas il ne représente le stock réel, mais uniquement un nombre commandé (non encore retiré du stock, selon où en est bien sur la commande : attention, ce que je dis là entre ces parenthèses dépends d'un choix de gestion de la mise à jour du stock à faire, expliqué plus bas)
A partir de là, il apparait une chose que tu n'as pas encore pris en compte pour bien gérer ton stock : savoir si une commande a été traitée ou non.
Pourquoi cette notion est importante : pour la simple et bonne raison que puisque dans la table PRODUIT tu as la quantité en stock réel de chaque produit, si tu souhaites pouvoir ajuster ce stock réel (donc cette quantité) de manière à savoir à n'importe quel moment si un produit est en stock ou non (selon les commandes passées - qu'elle soient en cours de traitement ou déjà traitées), il faut alors savoir le statut des commandes.
Ainsi, ton stock réel sera défalqué lorsqu'une commande passe en statut 'traitée' par exemple. Si bien que lorsqu'un client souhaite commandé un produit (et les produits qui le composent), il te faudra calculé s'il reste ou non en stock ces produits, en fonction du stock "réel", et les commandes passées qui ne sont pas encore "traitées" : ceci est logique, puisque tu ne vas pas autoriser un client à commander quelque chose qui virtuellement est encore en stock (dans la table PRODUIT) mais réellement est en rupture de stock (parce qu'il y a déjà plus de commande passées et non traitée que de produit en stock)
Attention : j'ai dit qu'un le stock d'un objet doit être défalqué lorsqu'une commande passe en statut 'traité', mais il faut bien noté qu'il s'agit d'un choix de gestion à choisir selon ce qui te semble le plus judicieux !
Je serai toi, j'ajouterai trois valeur possible sur le statut d'une commande : 'en cours', 'traité' et 'annulée'.
Ainsi, tu défalque la quantité de produit directement lorsqu'une commande est créer (statut 'en cours' donc). Et à chaque changement de statut de la commande, tu ajuste le stock. Par exemple, pour une commande en cours, le stock des produits commandés ayant été déjà défalqué (ce qui permet d'avoir une image en base du stock réel beaucoup plus juste en temps réel et évite de faire des calculs dans les scripts), si la commande est validée (statut 'traité'), ce stock ne changera pas. Par contre, si la commande est annulée, alors il faudra remettre le stock à niveau, en ajoutant les produits de la commande au stock réel (puisque ces produits seront à nouveau disponible)
ps: Au risque de me répéter, la table COMPOSE est surtout là pour tout ce qui attrait à la présentation des produits (et sous produits) aux clients lorsqu'ils souhaitent visualiser les produits, et les commander.
En espérant que cela t'ai donné une vision un peu plus clair de ce que ta base de données représente et permet de faire.
~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~ qu
Ta base de données te sert à plusieurs choses:
- modéliser le lien entre les différents produits (via la table COMPOSE). Ce lien possède une quantité, mais attention, ce n'est qu'une quantité fixe non représentative du stock, elle est là pour dire : cet objet est composé de tant de cet autre objet (pour chaque objet qui le compose, ou que lui-même compose)
- représenter le stock réel des produits (via la table PRODUIT). La table PRODUIT comprend une quantité, qui elle reflète le nombre de produit en stock réel pour chacun des produits enregistré dans la base de données.
- enregistrer les commandes clientes (via la table COMMANDE et INCLUT). La table COMMANDE permet de symboliser la commande, la table INCLUT permet de faire le lien entre la commande elle-même, et les produits commandés pour cette commande. Il y aura donc autant de lien dans la table 'INCLUT' que de différent type de produit commandé dans une commande. La table INCLUT possède une quantité qui représente le nombre d'exemplaire d'un produit commandé. En aucun cas il ne représente le stock réel, mais uniquement un nombre commandé (non encore retiré du stock, selon où en est bien sur la commande : attention, ce que je dis là entre ces parenthèses dépends d'un choix de gestion de la mise à jour du stock à faire, expliqué plus bas)
A partir de là, il apparait une chose que tu n'as pas encore pris en compte pour bien gérer ton stock : savoir si une commande a été traitée ou non.
Pourquoi cette notion est importante : pour la simple et bonne raison que puisque dans la table PRODUIT tu as la quantité en stock réel de chaque produit, si tu souhaites pouvoir ajuster ce stock réel (donc cette quantité) de manière à savoir à n'importe quel moment si un produit est en stock ou non (selon les commandes passées - qu'elle soient en cours de traitement ou déjà traitées), il faut alors savoir le statut des commandes.
Ainsi, ton stock réel sera défalqué lorsqu'une commande passe en statut 'traitée' par exemple. Si bien que lorsqu'un client souhaite commandé un produit (et les produits qui le composent), il te faudra calculé s'il reste ou non en stock ces produits, en fonction du stock "réel", et les commandes passées qui ne sont pas encore "traitées" : ceci est logique, puisque tu ne vas pas autoriser un client à commander quelque chose qui virtuellement est encore en stock (dans la table PRODUIT) mais réellement est en rupture de stock (parce qu'il y a déjà plus de commande passées et non traitée que de produit en stock)
Attention : j'ai dit qu'un le stock d'un objet doit être défalqué lorsqu'une commande passe en statut 'traité', mais il faut bien noté qu'il s'agit d'un choix de gestion à choisir selon ce qui te semble le plus judicieux !
Je serai toi, j'ajouterai trois valeur possible sur le statut d'une commande : 'en cours', 'traité' et 'annulée'.
Ainsi, tu défalque la quantité de produit directement lorsqu'une commande est créer (statut 'en cours' donc). Et à chaque changement de statut de la commande, tu ajuste le stock. Par exemple, pour une commande en cours, le stock des produits commandés ayant été déjà défalqué (ce qui permet d'avoir une image en base du stock réel beaucoup plus juste en temps réel et évite de faire des calculs dans les scripts), si la commande est validée (statut 'traité'), ce stock ne changera pas. Par contre, si la commande est annulée, alors il faudra remettre le stock à niveau, en ajoutant les produits de la commande au stock réel (puisque ces produits seront à nouveau disponible)
ps: Au risque de me répéter, la table COMPOSE est surtout là pour tout ce qui attrait à la présentation des produits (et sous produits) aux clients lorsqu'ils souhaitent visualiser les produits, et les commander.
En espérant que cela t'ai donné une vision un peu plus clair de ce que ta base de données représente et permet de faire.
~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~ qu
J'ai bien compris le système... Mais en faite il faut que j'arrive a défalquer le stock en utilisant la table COMPOSE.
En appelant cette fonction de manière récursive, pour pouvoir défalquer tous les produits contenus dans le pack...
function defalquerStock($idproduit,$quantite,$options=""){
$return="fonction defalquer\r\n";
$query = mysql_query("SELECT products_qt, products_id, products_sold
FROM products
WHERE products_id = '".$idproduit."'");
$row = mysql_fetch_array($query);
if($quantite !== 0 && !($row===false)) {
$aaa = $row['products_qt']-$quantite;
if($aaa<0)$aaa=0;
$bbb = $row['products_sold']+$quantite;
$updateStock = mysql_query("UPDATE products
SET
products_qt = ".$aaa.",
products_sold = ".$bbb."
WHERE products_id = '".$row['products_id']."'");
if($updateStock===false)$return.="\t\tstock produit non defalque\r\n";
else $return.="\t\tstock produit defalque\r\n";
}
Et aussi utiliser la table INCLUT pour les quantités des différents produits !
En appelant cette fonction de manière récursive, pour pouvoir défalquer tous les produits contenus dans le pack...
function defalquerStock($idproduit,$quantite,$options=""){
$return="fonction defalquer\r\n";
$query = mysql_query("SELECT products_qt, products_id, products_sold
FROM products
WHERE products_id = '".$idproduit."'");
$row = mysql_fetch_array($query);
if($quantite !== 0 && !($row===false)) {
$aaa = $row['products_qt']-$quantite;
if($aaa<0)$aaa=0;
$bbb = $row['products_sold']+$quantite;
$updateStock = mysql_query("UPDATE products
SET
products_qt = ".$aaa.",
products_sold = ".$bbb."
WHERE products_id = '".$row['products_id']."'");
if($updateStock===false)$return.="\t\tstock produit non defalque\r\n";
else $return.="\t\tstock produit defalque\r\n";
}
Et aussi utiliser la table INCLUT pour les quantités des différents produits !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Dans ce cas oubli tous ce que je t'ai dis et repars de 0. Tu ne pourras pas faire ce que tu souhaites avec ce que je t'ai donné.
Pourquoi ? Parce que la table COMPOSE est là pour représenter le lien entre les produits. L'information concernant le stock n'y est pas présente, et d'ailleurs comment l'inclure dans cette table ? Ce n'est pas possible.
Défalquer c'est bien beau, mais de la manière dont tu souhaites le faire c'est défalquer de 1 uniquement à chaque fois, a moins d'avoir l'information comme quoi tu dois pour telle commande défalquer de 3 et non 1 seul sur tel type d'objet (par exemple trois tiroirs B compris dans la commode C)
Bon courage pour la suite, et si tu trouve une solution adéquat, n'oublie pas de la poster ici, ça pourra toujours aider à l'avenir, ou ne serait-ce que pour moi, pour pouvoir aiguiller plus correctement la prochaine fois.
++
Dans ce cas oubli tous ce que je t'ai dis et repars de 0. Tu ne pourras pas faire ce que tu souhaites avec ce que je t'ai donné.
Pourquoi ? Parce que la table COMPOSE est là pour représenter le lien entre les produits. L'information concernant le stock n'y est pas présente, et d'ailleurs comment l'inclure dans cette table ? Ce n'est pas possible.
Défalquer c'est bien beau, mais de la manière dont tu souhaites le faire c'est défalquer de 1 uniquement à chaque fois, a moins d'avoir l'information comme quoi tu dois pour telle commande défalquer de 3 et non 1 seul sur tel type d'objet (par exemple trois tiroirs B compris dans la commode C)
Bon courage pour la suite, et si tu trouve une solution adéquat, n'oublie pas de la poster ici, ça pourra toujours aider à l'avenir, ou ne serait-ce que pour moi, pour pouvoir aiguiller plus correctement la prochaine fois.
++
Bonjour,
J'ai implémenté une fonction défalquerStock qui utilise la table produit et la table COMPOSE pour deflaquer le stock.
<?php
function defalquerStock($idproduit,$quantite){
$return="fonction defalquer\r\n";
$query = mysql_query("SELECT products_qt, products_id, products_sold
FROM products
WHERE products_id = '".$idproduit."'");
$row = mysql_fetch_array($query);
if($quantite !== 0 && !($row===false)) {
$aaa = $row['products_qt']-$quantite;
if($aaa<0)$aaa=0;
$bbb = $row['products_sold']+$quantite;
$updateStock = mysql_query("UPDATE products
SET
products_qt = ".$aaa.",
products_sold = ".$bbb."
WHERE products_id = '".$row['products_id']."'");
if($updateStock===false)$return.="\t\tstock produit non defalque\r\n";
else $return.="\t\tstock produit defalque\r\n";
}
$q = mysql_query( "SELECT Slave_id, Nombre FROM COMPOSE WHERE Master_id = '".$product_id."'" );
while( $row = mysql_fetch_assoc( $q )){
defalquerStock( $row['Slave_id'], $row['Nombre'] * $quantite );
}
}
?>
Par contre il subsiste un problème. Car dans la table COMPOSE il y a le produit Master et le produit Slave correspondant. Mais un client va choisir une chambre par exemple mais différentes options vont se présenter a lui : entre une commode 3 tiroirs et une commode 2 portes, 1 tiroir.
Donc dans la table COMPOSE il y aura : par exemple
Master Slave
530 526
530 527
530 : produit_id chambre
526 : commode 3 tiroirs
527 : commode 2 portes, 1 tiroir.
Comment faire pour différencier les options, en fonction des choix des clients pour que le stock soit defalquer correctement ?
Il faut surement utiliser la table INCLUT. Et je pensais faire un truc comme ça :
Code : PHP
<?php
$q = mysql_query( "SELECT Slave_id, Nombre FROM COMPOSE WHERE Master_id = '".$product_id."'" );
$q1 = mysql_query(SELECT products_id FROM INCLUT WHERE Com_id = "'.$Com_id."'");
while( $row = mysql_fetch_array($q)){
while ( $row1 = mysql_fetch_array($q1){
if ($row['products_id'] == $row1['Slave_id']){
while( $row = mysql_fetch_assoc( $q )){
defalquerStock( $row['Slave_id'], $row['Nombre'] * $quantite );
}
?>
Fait correspondre le bon products_id choisi par le client contenu dans la table INCLUT avec celui de la table COMPOSE.
Mais c'est un peu tiré par les cheveux, y'a surement une solution plus optimale...
Merci,
Tibo
J'ai implémenté une fonction défalquerStock qui utilise la table produit et la table COMPOSE pour deflaquer le stock.
<?php
function defalquerStock($idproduit,$quantite){
$return="fonction defalquer\r\n";
$query = mysql_query("SELECT products_qt, products_id, products_sold
FROM products
WHERE products_id = '".$idproduit."'");
$row = mysql_fetch_array($query);
if($quantite !== 0 && !($row===false)) {
$aaa = $row['products_qt']-$quantite;
if($aaa<0)$aaa=0;
$bbb = $row['products_sold']+$quantite;
$updateStock = mysql_query("UPDATE products
SET
products_qt = ".$aaa.",
products_sold = ".$bbb."
WHERE products_id = '".$row['products_id']."'");
if($updateStock===false)$return.="\t\tstock produit non defalque\r\n";
else $return.="\t\tstock produit defalque\r\n";
}
$q = mysql_query( "SELECT Slave_id, Nombre FROM COMPOSE WHERE Master_id = '".$product_id."'" );
while( $row = mysql_fetch_assoc( $q )){
defalquerStock( $row['Slave_id'], $row['Nombre'] * $quantite );
}
}
?>
Par contre il subsiste un problème. Car dans la table COMPOSE il y a le produit Master et le produit Slave correspondant. Mais un client va choisir une chambre par exemple mais différentes options vont se présenter a lui : entre une commode 3 tiroirs et une commode 2 portes, 1 tiroir.
Donc dans la table COMPOSE il y aura : par exemple
Master Slave
530 526
530 527
530 : produit_id chambre
526 : commode 3 tiroirs
527 : commode 2 portes, 1 tiroir.
Comment faire pour différencier les options, en fonction des choix des clients pour que le stock soit defalquer correctement ?
Il faut surement utiliser la table INCLUT. Et je pensais faire un truc comme ça :
Code : PHP
<?php
$q = mysql_query( "SELECT Slave_id, Nombre FROM COMPOSE WHERE Master_id = '".$product_id."'" );
$q1 = mysql_query(SELECT products_id FROM INCLUT WHERE Com_id = "'.$Com_id."'");
while( $row = mysql_fetch_array($q)){
while ( $row1 = mysql_fetch_array($q1){
if ($row['products_id'] == $row1['Slave_id']){
while( $row = mysql_fetch_assoc( $q )){
defalquerStock( $row['Slave_id'], $row['Nombre'] * $quantite );
}
?>
Fait correspondre le bon products_id choisi par le client contenu dans la table INCLUT avec celui de la table COMPOSE.
Mais c'est un peu tiré par les cheveux, y'a surement une solution plus optimale...
Merci,
Tibo
Re,
Sincèrement, la solution a déjà été donnée. Tu t'emmêle les pinceaux.
Comment faire pour différencier les options, en fonction des choix des clients pour que le stock soit defalquer correctement ?
Deux questions en une. Première question : comment différentier les options. Seconde question : comment défalquer correctement.
La réponse à la seconde question a été données plus haut.
La réponse à la première question est tout autre. La base de données actuelle ne permet pas de représenter les options présentables aux clients lorsqu'ils souhaitent acheter un produit.
Cette base te permet de gérer correctement ton stock (si tu te réfère et suit les réponses précédemment données), c'est déjà une chose.
Pour ce qui est de représenter les différents choix, il faut penser à refaire la base d'une autre manière, ou la modifier pour intégrer ces choix entre différents produits.
Là dessus, je sèche - pour le moment. Il faudrait à la rigueur un peu plus de précision sur la question :
- Est ce que le nombre d'option est limité, ou est ce qu'il faut prendre en compte la possibilité d'avoir beaucoup d'option.
- Est ce qu'un produit qui est une option / choix peut l'être sur plusieurs produit (exemple du tiroir B qui peut être une option pour différente armoire ou bureau par exemple)
- Comment s'organisent les options entre elle pour un même produit. Par là je veux dire : est ce que pour un produit qui présente des options, tu as des cas où c'est "je choisis entre ça, ou bien ça, ou bien ça" mais aussi "je choisis entre ça ou bien ça ou bien ça ET ça ou bien ça) (plusieurs choix d'option lié au même objet)
Je pense qu'en répondant à ces questions tu avancera déjà un peu vers la solution à mettre en place.
Sincèrement, la solution a déjà été donnée. Tu t'emmêle les pinceaux.
Comment faire pour différencier les options, en fonction des choix des clients pour que le stock soit defalquer correctement ?
Deux questions en une. Première question : comment différentier les options. Seconde question : comment défalquer correctement.
La réponse à la seconde question a été données plus haut.
La réponse à la première question est tout autre. La base de données actuelle ne permet pas de représenter les options présentables aux clients lorsqu'ils souhaitent acheter un produit.
Cette base te permet de gérer correctement ton stock (si tu te réfère et suit les réponses précédemment données), c'est déjà une chose.
Pour ce qui est de représenter les différents choix, il faut penser à refaire la base d'une autre manière, ou la modifier pour intégrer ces choix entre différents produits.
Là dessus, je sèche - pour le moment. Il faudrait à la rigueur un peu plus de précision sur la question :
- Est ce que le nombre d'option est limité, ou est ce qu'il faut prendre en compte la possibilité d'avoir beaucoup d'option.
- Est ce qu'un produit qui est une option / choix peut l'être sur plusieurs produit (exemple du tiroir B qui peut être une option pour différente armoire ou bureau par exemple)
- Comment s'organisent les options entre elle pour un même produit. Par là je veux dire : est ce que pour un produit qui présente des options, tu as des cas où c'est "je choisis entre ça, ou bien ça, ou bien ça" mais aussi "je choisis entre ça ou bien ça ou bien ça ET ça ou bien ça) (plusieurs choix d'option lié au même objet)
Je pense qu'en répondant à ces questions tu avancera déjà un peu vers la solution à mettre en place.
Donc si j'utilise simplement la table INCLUT avec préalablement l'ajout des produits qui compose une commande dans la table en fonction des choix du clients :
//Ajout d'une commande
$prix_total_calcule = '1500';
mysql_query ("INSERT INTO COMMANDE ( Com_id, Prix_total_calculé, client_id ) VALUES ( NULL, '".$prix_total_calcule."', '')");
//Ajout des produits de la commande
if(isset($_GET['optionNum']) && $_GET['optionNum'] > 0) {
for($i=1; $i<=$_GET['optionNum']; $i++) {
$opt1 = explode("/",$_GET['option'][$i]);
$optionList[] = $opt1[0].(($opt1[3]=="")?"":" - ".$opt1[3]);
$priceMod[] = $opt1[1];
$optionPoids[] = $opt1[2];
$optionRefs[] = $opt1[3];
$optionachat[] = $opt1[4];
}
}
$updatePrice = array_sum($priceMod);
echo $updatePrice."<br/>";
$ref = $optionRefs[1];
echo $ref."<br/>";
$ref = "CSG-B";
$req_id = mysql_query("SELECT products_id FROM products WHERE products_ref = '".$ref."'");
while ($row = mysql_fetch_array($req_id)) {
echo $row['products_id']."<br/>";
mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '15', '".$row['products_id']."', '1', '0 + ".$updatePrice."')");
}
J'ai testé ça marche.
Pour ensuite gérer la défalcation simplement comme cela :
//Defalquer le stock en fonction d'une commande donnée
$id = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '".$com_id."'");
while ($row = mysql_fetch_array ($id)) {
$qt = mysql_query("SELECT Quantite FROM INCLUT WHERE products_id = '".$row['products_id']."'");
while ($row1 = mysql_fetch_array ($qt)) {
$up = "UPDATE products SET products_qt = products_qt - (".$row1['Quantite'].") WHERE products_id = '".$row['products_id']."'";
mysql_query($up);
}
}
Il manque quelques trucs mais dans l'idée, ça suffirait ? Il n'y aurais pas besoin alors d'utiliser la table COMPOSE ?
La table COMPOSE ne servirait qu'a visualiser comme il faut les différents packs...
//Ajout d'une commande
$prix_total_calcule = '1500';
mysql_query ("INSERT INTO COMMANDE ( Com_id, Prix_total_calculé, client_id ) VALUES ( NULL, '".$prix_total_calcule."', '')");
//Ajout des produits de la commande
if(isset($_GET['optionNum']) && $_GET['optionNum'] > 0) {
for($i=1; $i<=$_GET['optionNum']; $i++) {
$opt1 = explode("/",$_GET['option'][$i]);
$optionList[] = $opt1[0].(($opt1[3]=="")?"":" - ".$opt1[3]);
$priceMod[] = $opt1[1];
$optionPoids[] = $opt1[2];
$optionRefs[] = $opt1[3];
$optionachat[] = $opt1[4];
}
}
$updatePrice = array_sum($priceMod);
echo $updatePrice."<br/>";
$ref = $optionRefs[1];
echo $ref."<br/>";
$ref = "CSG-B";
$req_id = mysql_query("SELECT products_id FROM products WHERE products_ref = '".$ref."'");
while ($row = mysql_fetch_array($req_id)) {
echo $row['products_id']."<br/>";
mysql_query("INSERT INTO INCLUT ( Com_id, products_id, Quantite, Prix) VALUES ( '15', '".$row['products_id']."', '1', '0 + ".$updatePrice."')");
}
J'ai testé ça marche.
Pour ensuite gérer la défalcation simplement comme cela :
//Defalquer le stock en fonction d'une commande donnée
$id = mysql_query("SELECT products_id FROM INCLUT WHERE Com_id = '".$com_id."'");
while ($row = mysql_fetch_array ($id)) {
$qt = mysql_query("SELECT Quantite FROM INCLUT WHERE products_id = '".$row['products_id']."'");
while ($row1 = mysql_fetch_array ($qt)) {
$up = "UPDATE products SET products_qt = products_qt - (".$row1['Quantite'].") WHERE products_id = '".$row['products_id']."'";
mysql_query($up);
}
}
Il manque quelques trucs mais dans l'idée, ça suffirait ? Il n'y aurais pas besoin alors d'utiliser la table COMPOSE ?
La table COMPOSE ne servirait qu'a visualiser comme il faut les différents packs...
Dans ta requête d'update du stock pour chaque produit lié à une commande, au niveau de la quantité à défalquer, ce n'est pas toujours 1. La preuve, certaines quantité sont à 0 dans tes requête d'insert dans la table 'INCLUT', et tu laisse à -1 lorsque tu défalquer.
A un moment donné tu vas avoir un problème d'intégrité de ta base de données, les chiffres / les calculs sur les champs désignant les stocks ne correspondront pas à ce qu'il y a réellement en stock (dans la réalité)
Donc dans ta requête d'update, il faut défalqué de la quantité de l'item (pas juste de 1 fixe):
Qui plus est, ton code est quelque peu érroné au niveau du traitement effectué pou défalquer.
Fais comme ça plutôt:
$sel = mysql_query("SELECT products_id, Quantite FROM INCLUT WHERE Com_id = '12'"); while ( ($line = @mysql_fetch_array($sel)) != null ){ $up = "UPDATE products SET products_qt = products_qt - ".$line[1]." WHERE products_id = '".$line[0]."'"; }