hulk Posted December 17, 2011 Share Posted December 17, 2011 Bonjour j'ai remarqué un problème au niveau de gestion du stock lorsque je passe une commande: si j'ai un produit comme suit produit ---------attribut1--------- stock 0 produit ---------attribut2--------- stock 2 produit ---------attribut3--------- stock 0 et je commende tout le stock restant (ici 2 pour l'attribut2) a partir du BO a l'aide d'un module développé pour la création des commandes en BO. la création du commande se fait convenablement. dans la fiche du commande j'ai le produit commandé ++ PU* ++ Qté 2 ++ remboursé 0 ++ Stock 0 ++ total... comme vous voyez j'ai le stock nul mais lorsque je me rend sur la fiche produit j'ai toujours le stock en 2. dans ce module(que j'ai amélioré sur mesure) j'ai une fonction pour mettre à jour la quantité du chaque attribut avant de passer la commande pour ne pas se rendre a la fiche produit pour en modifier la quantité. voici le code qui gère l'ajout du commande include_once(dirname(__FILE__).'/../../../config/config.inc.php'); include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); $var = $_POST['attribute_'.$_POST['id_product']]; if(isset($_POST['id_product'], $_POST['quantity'])) // Si le formulaire est envoyé. { if (!empty($_POST['id_product']) AND !empty($_POST['quantity']));// Si tous les champs ont été remplis correctement. { $sql = 'UPDATE '._DB_PREFIX_.'product_attribute SET '._DB_PREFIX_.'product_attribute.quantity='.$_POST['quantity'].' WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'].' AND '._DB_PREFIX_.'product_attribute.id_product_attribute ='.$var; $rq = Db::getInstance()->ExecuteS($sql); $sel = 'SELECT SUM('._DB_PREFIX_.'product_attribute.quantity) AS total FROM '._DB_PREFIX_.'product_attribute WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product']; $req = Db::getInstance()->ExecuteS($sel); foreach ($req as $line) { $upd = 'UPDATE '._DB_PREFIX_.'product SET '._DB_PREFIX_.'product.quantity='.$line['total'].' WHERE '._DB_PREFIX_.'product.id_product='.$_POST['id_product']; $rq = Db::getInstance()->ExecuteS($upd); } } } je crois que le 1er bout de code s’exécute plus d'une fois. Link to comment Share on other sites More sharing options...
doekia Posted December 17, 2011 Share Posted December 17, 2011 Salut, Je ne sais pas où tu as trouvé ce module qui fait en effet plein de chose non conforme. Il ajoute en outre des failles (je devrais dire gouffres) de sécurité. A bannir. Le premier segment de code ne s'exécute même pas dans le contexte de l'object AdminTab. Il s'exécute donc à chaque fois sans contrôle des permission et même si il s'agit d'une annonce du BO. A bannir. Cdlt, (d)oekia Link to comment Share on other sites More sharing options...
hulk Posted December 17, 2011 Author Share Posted December 17, 2011 pour le premier segment du code c'est moi qui l'a fait est ce que t'a une idée comment le corriger? pour le rendre conforme je travaille avec la version 1.2.5 Link to comment Share on other sites More sharing options...
doekia Posted December 17, 2011 Share Posted December 17, 2011 Je pense que tout le segment devrait entre dans la postProcess de la classe (à vérifier par rapport à ton code) Sinon, SQL injection ici: $sql = 'UPDATE '._DB_PREFIX_.'product_attribute SET '._DB_PREFIX_.'product_attribute.quantity='.$_POST['quantity'].' WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product'].' AND '._DB_PREFIX_.'product_attribute.id_product_attribute ='.$var; et là: $upd = 'UPDATE '._DB_PREFIX_.'product SET '._DB_PREFIX_.'product.quantity='.$line['total'].' WHERE '._DB_PREFIX_.'product.id_product='.$_POST['id_product']; et encore là: $sel = 'SELECT SUM('._DB_PREFIX_.'product_attribute.quantity) AS total FROM '._DB_PREFIX_.'product_attribute WHERE '._DB_PREFIX_.'product_attribute.id_product='.$_POST['id_product']; Quelque chose comme ça: $sel = 'SELECT SUM(coalesce(`quantity`,0) AS total FROM `'._DB_PREFIX_.'product_attribute` WHERE id_product='.(int)$_POST['id_product']; Et ... si le produit n'a pas de déclinaison au fait? Link to comment Share on other sites More sharing options...
hulk Posted December 19, 2011 Author Share Posted December 19, 2011 merci doekia je vais m'expliquer plus: ce module fait appel a 2 autres fichiers php en ajax : un pour la recherche clients et l'autre pour la recherche produits. lorsque tu tape quelques lettres du nom du client ou nom du produit, une liste s'affiche sous le champ recherche a chaque saisie de caractère. pour mon besoin j'ai modifier le fichier recherche produits en ajoutant un formulaire pour l'ajout quantité en stock (un bouton submit + champ quantité), ce formulaire envoi les données a un autre fichier que j'ai ajouté ajout_qty.php qui contient le premier segment du code dans mon premier post #1. j'ai commenté un par un les bout de code ajoutés pour voir d'ou vient le source du problème et j'a découvert que c'est le nouveau formulaire que j'ai ajouté au fichier recherche produits si je l'élimine tout ça marche nickel et après avoir enregistrer la commande le stock du produit diminue. je voudrais savoir comment je peut ajouter ce formulaire sans qu'il influence sur le fonctionnement du module?? merci d'avance Link to comment Share on other sites More sharing options...
doekia Posted December 19, 2011 Share Posted December 19, 2011 Que te dire? Vérifier que ton formulaire est bien dans son propre <form> pas d'imbrication. Que sais-je encore. Ah si ... tu crois que ça veux dire quoi "./tabs/modules...."? Tu as bien quelque chose à cette adresse? Il n'empèche que la sécurité laisse carrément à désirer et ça c'est carrément le premier problème (d)oekia Link to comment Share on other sites More sharing options...
hulk Posted December 19, 2011 Author Share Posted December 19, 2011 oui j'a le fichier ajout_qty.php ou je récupère les quantités a jouter en stock pour mes produits sélectionnés (1 er segment de code). Link to comment Share on other sites More sharing options...
hulk Posted December 20, 2011 Author Share Posted December 20, 2011 j'ai y presque, j'a ajouté un bout de code pour la mis à jour du stock et ça marche bien pour les produit séléctionnés pour ma commande voici le code foreach($productIDs AS $id_product) { $idProduct = intval($id_product); if(isset($_POST['attribute_'.$id_product])) $idProductAttribute = intval($_POST['attribute_'.$id_product]); else $idProductAttribute = 0; // debut code ajoute if(!empty($_POST['quantite'])) foreach($_POST['quantite'] as $id =>$valeur) { ...... } } } mais je crois que c'est pas placé au bon endroit car après ce code j'ai des contrôles comme vous le voyez en haut. Lorsque je passe une commande en ajoutant du stock et j'ai un erreur "product is no longer available" pour le contrôle elseif (!$producToAdd->checkQty(intval($qty) le stock change malgré ce message ce que veut dire que j'ai mis le code au mauvais emplacement ou que j'ai oublié quelque contrôle pour que le stock s'ajoute sans messages d'erreur. Link to comment Share on other sites More sharing options...
doekia Posted December 20, 2011 Share Posted December 20, 2011 <?php foreach($productIDs AS $id_product) { $idProduct = (int)$id_product; $idProductAttribute = (isset($_POST['attribute_'.$id_product])?(int)$_POST['attribute_'.$id_product]:0); if (!$idProduct) continue; if (isset($_POST['quantite']) && !empty($_POST['quantite'])) { foreach($_POST['quantite'] as $id => &$valeur) { if ( (int)$id == $idProduct ) { $sql = ' UPDATE `'._DB_PREFIX_.'product_attribute`' .' SET quantity = '.(int)$valeur .' WHERE id_product = '.$id .' AND id_product_attribute = '.$idProductAttribute; $rq = Db::getInstance()->ExecuteS($sql); $qty = intval(abs($_POST['amount_'.$id_product])); /* Surement là ton erreur tu prends amount pour quantity ?? $price = floatval($_POST['price_'.$id_product]); $totalProducts += ($qty * $price); */ if ($qty == 0) $errors[] = Tools::displayError('null quantity'); elseif (!$idProduct) $errors[] = Tools::displayError('product not found'); } else { $producToAdd = new Product((int)$idProduct, false, (int)$cookie->id_lang); if (!Validate::isLoadedObject($productToAdd)) $errors[] = Tools::displayError('product is no longer available'); else { /* Check the quantity availability */ if ($idProductAttribute AND $idProductAttribute) { if ( !$producToAdd->isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty((int)$idProductAttribute) (int)$qty ) $errors[] = Tools::displayError('product is no longer available'); } elseif (!$producToAdd->checkQty((int)$qty)) $errors[] = Tools::displayError('product is no longer available'); } if (!sizeof($errors)) { //ADD PRODUCT TO CART if ($qty >= 0) { if (!$cart->updateQty(intval($qty), intval($idProduct), intval($idProductAttribute))) $errors[] = Tools::displayError('you already have the maximum quantity available for this product'); } } } } } Link to comment Share on other sites More sharing options...
hulk Posted December 20, 2011 Author Share Posted December 20, 2011 merci deokia pour la correction . pour le champ amount_ c'est juste le nom du champ quantité a commander. j'ai copier coller ce code mais j'ai une page blanche: il manque des (),des {} et des virgules (a cause de l'éditeur du forum), merci de me le renvoyé dans un doc texte en pièce jointe ou en PM. Link to comment Share on other sites More sharing options...
hulk Posted December 20, 2011 Author Share Posted December 20, 2011 j'ai corrigé les erreurs dans ton code en conservant les test comme ils sont mais lorsque je commande avec un produit épuisé en lui ajoutant du stock (ex 2) j'ai bien la commande passée avec le prix du produit mais sans ajouter le produit (nom, PU, stock,...) en fiche commande en plus le stock est ajouté sans déduire la quantité commandée !!! le problème c'est que l'ajout doit se faire avant la vérification du stock :c a d mettre le produit en stock puis faire les test en bas et lorsque il y a une erreur elle s'affiche mais après que le stock a été modifié Link to comment Share on other sites More sharing options...
doekia Posted December 20, 2011 Share Posted December 20, 2011 J'avais qu'un bout donc j'ai commencé puis je me suis arrêté Et je n'ai aucune idée de ce que contient ou doit contenir quantite ni les reste des données POST Link to comment Share on other sites More sharing options...
hulk Posted December 20, 2011 Author Share Posted December 20, 2011 je pense a faire un truc banale: l'ajout se fait dans tous les cas , si -OK la commande sera créée et le stock changé -KO le message d'erreur s'affiche + la quantité ajoutée sera déduite de nouveau du stock modifié, mais cette modif je vais le faire avec une commande UPDATE et SELECT imbriqué (2 en 1) a partir de la première requête UPDATE que j'ai fait. je continu a faire des test pour voir si ça marche ou pas surtout l'affichage du message d'erreur Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now