SandraNanou Posted August 22, 2018 Share Posted August 22, 2018 (edited) Bonsoir, Je me casse la tête pour comprendre pourquoi mon code ne fonctionne pas !! J'ai développé un petit script qui permet de mettre à jour mes prix et stocks via un csv : foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE ps_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE ps_stock_available AS s INNER JOIN ps_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN ps_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; } $donneeFormate fait référence aux colonnes de mon csv : $donneeFormate[1] : colonne Références $donneeFormate[2] : colonne Quantité $donneeFormate[3] : colonne Prix Ce code fonctionne très bien pour la MAJ de produits standards. Malheureusement, j'ai également des produits avec attributs. J'ai tenté ce code : $mysqlquery=" UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '".$donneeFormate[1]."'; Ce qui est étrange, c'est que si je rentre cette ligne de code directement dans PHP my admin, il fonctionne. Par exemple : UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = 777 WHERE p.reference = 77881/39 Mais mon code ne fonctionne jamais quand je l'ajoute à ma boucle. Vous avez une idée de là où je me suis tromprée ? Merci pour votre aide, Sandra Edited August 22, 2018 by SandraNanou (see edit history) Link to comment Share on other sites More sharing options...
Eolia Posted August 22, 2018 Share Posted August 22, 2018 Z'êtes sûre de votre code ? p.reference il vient d'où ? Ou est la table correspondant à l'alias "p" ??? Link to comment Share on other sites More sharing options...
SandraNanou Posted August 22, 2018 Author Share Posted August 22, 2018 En effet, je me suis embrouillé en essayant tous les codes possibles ^^ Celui là fonctionne quand je fais la requête directement dans ma base de données : UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = 777 WHERE reference = "77881/39" Link to comment Share on other sites More sharing options...
Eolia Posted August 22, 2018 Share Posted August 22, 2018 ok mais dans votre code php vous appelez myBoutik_product_attribute Elle sort d'où celle-là ? Link to comment Share on other sites More sharing options...
SandraNanou Posted August 22, 2018 Author Share Posted August 22, 2018 La fatigue, pardon... Je tentais de cacher le préfixe de mes tables dans le forum... j'ai corrigé. Link to comment Share on other sites More sharing options...
Eolia Posted August 22, 2018 Share Posted August 22, 2018 ok.. un die(var_dump($mysqlquery)); donne quoi, juste après cette ligne ? $mysqlquery=" UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '".$donneeFormate[1]."'; Link to comment Share on other sites More sharing options...
Knowband Plugins Posted August 23, 2018 Share Posted August 23, 2018 14 hours ago, SandraNanou said: Bonsoir, Je me casse la tête pour comprendre pourquoi mon code ne fonctionne pas !! J'ai développé un petit script qui permet de mettre à jour mes prix et stocks via un csv : foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE ps_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE ps_stock_available AS s INNER JOIN ps_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN ps_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; } $donneeFormate fait référence aux colonnes de mon csv : $donneeFormate[1] : colonne Références $donneeFormate[2] : colonne Quantité $donneeFormate[3] : colonne Prix Ce code fonctionne très bien pour la MAJ de produits standards. Malheureusement, j'ai également des produits avec attributs. J'ai tenté ce code : $mysqlquery=" UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '".$donneeFormate[1]."'; Ce qui est étrange, c'est que si je rentre cette ligne de code directement dans PHP my admin, il fonctionne. Par exemple : UPDATE ps_stock_available AS s INNER JOIN ps_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = 777 WHERE p.reference = 77881/39 Mais mon code ne fonctionne jamais quand je l'ajoute à ma boucle. Vous avez une idée de là où je me suis tromprée ? Merci pour votre aide, Sandra Aussi, c'est le bon code? Vous ne savez pas pourquoi il y a un opérateur append ($ mysqlquery. = "") Dans la requête? Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 Bonsoir, Je vous remet la totalité de mon code pour vous aider avec le vrai nom des tables pour ne pas m'embrouiller pour rien ! En gros, on récupère tous les soirs un fichier sur le ftp (csvstock), que l'on récupère, converti en csv et modifie pour ne garder que 4 colonnes : Fournisseur, Référence produit, prix et quantité. Pour les produits simples, on va récupérer l'ID correspondant à la Référence produit dans la table myBoutik_product puis on met la table à jour ainsi que myBoutik_product_shop via l'ID produit ainsi récupéré. Cette requête fonctionne bien. J'aimerais faire la même chose pour les produits avec attributs. Récupérer l'ID attribut correspondant à la Référence produit dans la table myBoutik_product_attribute puis mettre à jour le stock produit dans la table myBoutik_stock_available via l'ID attribute. Il faudra ensuite que je trouve une solution pour mettre les prix des attributs à jour mais chaque problème en son temps^^ $filename = dirname(__FILE__).'/in/csvstock'; $date=new DateTime(); $dateFormat=$date->format('Ymd-Hi'); $newname="FLUX001_".$dateFormat.".csv"; if (file_exists($filename)) { echo "Le fichier $filename existe. Debut de la synchro<br/>"; } else { echo "Le fichier $filename n'a pas ete synchronise"; die(); } if (rename($filename, dirname(__FILE__).'/in/'.$newname)) { echo "Le fichier $filename a été renommé en $newname.<br/>"; } else { echo "Le fichier $filename n'a pas pu être renommé"; die(); } //sépare les données et crée les colonnes $donnees=array(); $row = 1; if (($handle = fopen(dirname(__FILE__).'/in/'.$newname, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "|")) !== FALSE) { $donnees[]=$data; } fclose($handle); } $donneesFormate=array(); foreach($donnees as $donnee){ $donneesFormate[]=array($donnee[2], $donnee[3], (int)$donnee[4], (float)$donnee[7]); } //2-c Crée un backup qu'il place dans /in/backup if (rename(dirname(__FILE__).'/in/'.$newname, dirname(__FILE__).'/in/backup/'.$newname)) { echo "Le fichier $newname a été placé dans /in/backup<br/>"; } else { echo "Le fichier $newname n'a pas pu être placé dans /in/backup<br/>"; } //2-d Crée un fichier FLUX002_aaaammjj-hhmm.csv qui ne garde que les colonnes : Fournisseur, Référence, quantité, prix que le programme stocke dans /stock/out $fp = fopen(dirname(__FILE__).'/stock/FLUX002_'.$dateFormat.'.csv', 'w'); foreach ($donneesFormate as $donneeFormate) { fputcsv($fp, $donneeFormate, ';'); } fclose($fp); $user = '***'; $pass = '***'; $db = new PDO('mysql:host=******;dbname=***', $user, $pass); $mysqlquery=''; foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE myBoutik_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN myBoutik_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; $mysqlquery.=" UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " '"; } var_dump($mysqlquery); $stmt = $db->prepare($mysqlquery); $stmt->execute(); echo 'done'; J'espère être plus claire. Merci beaucoup pour votre aide, Sandra Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 il manque un point-virgule à la dernière ligne: SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " '"; ceci serait mieux vu qu'on est dans une boucle foreach, le reste de vos requêtes ne sera pas lu par le moteur sql sinon^^ SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " ';"; Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 Ça fonctionne !! Merci beaucoup ! Olala, tout ça pour un point virgule Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 Je vais tenter de pousser ma chance mais est-ce que vous auriez une idée de comment procéder pour mettre à jour les prix des attributs ? Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 Pour vos prix, il faut récupérer le prix du produit de base et suivant celui reçu dans votre csv mettre la différence/ajout dans la colonne price de ps_product_attribute Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 ok merci pour vos indications, je vais essayer. Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 J'ai crié victoire trop vite... Les quantités des attributs se mettent bien à jour mais pas la quantité totale. Je ne trouve pas le moyen de mettre à jour la quantité totale du produits, une idée ? Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 la quantité totale doit être mise dans stock_available pour le produit avec id_product_attribute 0 Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 Quelque chose comme ça ? $mysqlquery.=" UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product SET s.quantity = SUM(".$donneeFormate[2].") WHERE reference = '". $donneeFormate[1] . " '; AND id_product_attribute= 0 "; Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 avec un ; en moins cette fois-ci^^ Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 J'ai tenté cette requête directement dans la BDD mais j'ai une erreur : #1052 - Column 'id_product_attribute' in where clause is ambiguous Ma ligne de code : UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product SET s.quantity = 789 WHERE reference = '77881/39' AND id_product_attribute= 0 Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 (edited) ok j'ai trouvé ^^ UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product SET s.quantity = 789 WHERE reference = '77881/39' AND s.id_product_attribute= 0 Mais ma requête ne donne rien dans ma boucle : $mysqlquery.="UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product SET s.quantity = 789 WHERE reference = '77881/39' AND s.id_product_attribute= 0"; Une erreur de guillemet ou point virgule encore ?!? Edited August 23, 2018 by SandraNanou (see edit history) Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 1- est-ce que la ligne existe avec cet id_produit et cet id_product_attribute 0 dans stock_available ? 2- est-ce que cette ligne a bien cette référence ? Link to comment Share on other sites More sharing options...
SandraNanou Posted August 23, 2018 Author Share Posted August 23, 2018 Dans myBoutik_product_attribute, j'ai bien la référence produit 77881/39 qui renvoie à l'ID 270. Dans myBoutik_stock_available, l'ID 270 a bien un id_product_attribute à 0 Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2018 Share Posted August 23, 2018 oui mais non, dans un update on ne peut pas joindre comme ça^^ Que vous donne: SELECT s.id_product from myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product WHERE reference = '77881/39' AND s.id_product_attribute= 0 Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 La requête me sort bien l'ID correspondant, 270. Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 ok Par contre, dans votre screen précédent, les quantités semblent ok ? (3 = 2 + 1) Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 (edited) Je les avait changé manuellement au final, le site est accessible. J'essayais d'entrer un nombre prédéfini pour id_product_attribute 0 avant de passer à l'étape addition. Cette requête SQL fonctionnait : UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product SET s.quantity = 789 WHERE reference = '77881/39' AND s.id_product_attribute= 0 Edited August 24, 2018 by SandraNanou (see edit history) Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 Mais du coup, il faut que je sélectionne i'ID puis que j'update ma table c'est ça ? Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 Yes Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 $mysqlquery.="SELECT s.id_product from myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product = s.id_product WHERE reference = '77881/39' AND s.id_product_attribute= 0"; Comment dois-je faire pour stocker mon ID et mettre à jour la table ? Il faut que je créée une autre boucle ? Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 Non... UPDATE myBoutik_stock_available SET quantity = xxx WHERE id_product = (SELECT id_product FROM myBoutik_product_attribute WHERE reference = '77881/39'); La quantité, vous la calculez avant dans votre csv Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 Merci ça fonctionne !! Mais calculer la quantité totale dans le csv, ça parait compliqué, il est envoyé par l'ERP, je n'ai pas vraiment la main dessus. Je ne peux pas additionner toutes les quantités des mêmes Id produits ? Mais alors la, je ne sais pas pas ou commencer ! Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 Le 23/08/2018 à 11:35 AM, SandraNanou a dit : foreach ($donneesFormate as $donneeFormate) { fputcsv($fp, $donneeFormate, ';'); } fclose($fp); Euh... c'est bien vous qui créez celui-là, non ? Créez une clé $quantité['reference'] que vous initialisez à 0 puis que vous incrémentez Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 non le code existait déjà, je fais une mise à jour car les tables de prestashop ont changé (le shop était sur presta 1.4). Je n'ai clairement pas le niveau^^ $quantité['reference'] devrait être une nouvelle colonne ? Et comment l'incrémenter ? Toutes les références dans le cvs sont différentes. Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 ok alors on va faire autrement^^ Une fois le traitement terminé, vous lancez un update général: $query = 'SELECT SUM(`quantity`) as total, `id_product` FROM `myBoutik_stock_available` WHERE `id_product_attribute` != 0 GROUP BY `id_product`'; $request = $db->prepare($query); $request->execute(); $results = $request->fetchAll(); $update_query = ''; foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].';' } $update = $db->prepare($update_query); $update->execute(); Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 La quantité se met a 375 partout. Le code en entier : // Renomme le fichier en web_art - FLUX001_aaaammjj-hhmm.csv $filename = dirname(__FILE__).'/in/web_stock'; $date=new DateTime(); $dateFormat=$date->format('Ymd-Hi'); $newname="FLUX001_".$dateFormat.".csv"; if (file_exists($filename)) { echo "Le fichier $filename existe. Debut de la synchro<br/>"; } else { echo "Le fichier $filename n'a pas ete synchronise"; die(); } if (rename($filename, dirname(__FILE__).'/in/'.$newname)) { echo "Le fichier $filename a été renommé en $newname.<br/>"; } else { echo "Le fichier $filename n'a pas pu être renommé"; die(); } //sépare les données et crée les colonnes (voir fichier joint pour exemple avec le fichier brut et sa transformation) $donnees=array(); $row = 1; if (($handle = fopen(dirname(__FILE__).'/in/'.$newname, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "|")) !== FALSE) { $donnees[]=$data; } fclose($handle); } $donneesFormate=array(); foreach($donnees as $donnee){ $donneesFormate[]=array($donnee[2], $donnee[3], (int)$donnee[4], (float)$donnee[7]); } //2-c Crée un backup qu'il place dans /echange/in/backup if (rename(dirname(__FILE__).'/in/'.$newname, dirname(__FILE__).'/in/backup/'.$newname)) { echo "Le fichier $newname a été placé dans /echange/in/backup<br/>"; } else { echo "Le fichier $newname n'a pas pu être placé dans /echange/in/backup<br/>"; } //2-d Crée un fichier FLUX002_aaaammjj-hhmm.csv qui ne garde que les colonnes : Fournisseur, Référence, quantité, prix //que le programme stocke dans /echange/out $fp = fopen(dirname(__FILE__).'/out/FLUX002_'.$dateFormat.'.csv', 'w'); foreach ($donneesFormate as $donneeFormate) { fputcsv($fp, $donneeFormate, ';'); } fclose($fp); $user = '***'; $pass = '***'; $db = new PDO('mysql:host=***;dbname=***', $user, $pass); $mysqlquery=''; foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE myBoutik_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_product_attribute SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN myBoutik_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; $mysqlquery.=" UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " ';"; //MAJ de la colonne QTE de l'attribut 0 $query = 'SELECT SUM(`quantity`) as total, `id_product` FROM `myBoutik_stock_available` WHERE `id_product_attribute` != 0 GROUP BY `id_product`'; $request = $db->prepare($query); $request->execute(); $results = $request->fetchAll(); $update_query = ''; foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].';' ; } $update = $db->prepare($update_query); $update->execute(); } var_dump($mysqlquery); $stmt = $db->prepare($mysqlquery); $stmt->execute(); echo 'done'; Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 oups j'ai oublié un bout^^ foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].' AND id_product_attribute = 0;' } Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 Mais vous n'avez pas mis mon code au bon endroit non plus, il faut le mettre tout à la fin, après votre traitement ! Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 (edited) Votre code complet // Renomme le fichier en web_art - FLUX001_aaaammjj-hhmm.csv $filename = dirname(__FILE__).'/in/web_stock'; $date=new DateTime(); $dateFormat=$date->format('Ymd-Hi'); $newname="FLUX001_".$dateFormat.".csv"; if (file_exists($filename)) { echo "Le fichier $filename existe. Debut de la synchro<br/>"; } else { echo "Le fichier $filename n'a pas ete synchronise"; die(); } if (rename($filename, dirname(__FILE__).'/in/'.$newname)) { echo "Le fichier $filename a été renommé en $newname.<br/>"; } else { echo "Le fichier $filename n'a pas pu être renommé"; die(); } //sépare les données et crée les colonnes (voir fichier joint pour exemple avec le fichier brut et sa transformation) $donnees=array(); $row = 1; if (($handle = fopen(dirname(__FILE__).'/in/'.$newname, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "|")) !== FALSE) { $donnees[]=$data; } fclose($handle); } $donneesFormate=array(); foreach($donnees as $donnee){ $donneesFormate[]=array($donnee[2], $donnee[3], (int)$donnee[4], (float)$donnee[7]); } //2-c Crée un backup qu'il place dans /echange/in/backup if (rename(dirname(__FILE__).'/in/'.$newname, dirname(__FILE__).'/in/backup/'.$newname)) { echo "Le fichier $newname a été placé dans /echange/in/backup<br/>"; } else { echo "Le fichier $newname n'a pas pu être placé dans /echange/in/backup<br/>"; } //2-d Crée un fichier FLUX002_aaaammjj-hhmm.csv qui ne garde que les colonnes : Fournisseur, Référence, quantité, prix //que le programme stocke dans /echange/out $fp = fopen(dirname(__FILE__).'/out/FLUX002_'.$dateFormat.'.csv', 'w'); foreach ($donneesFormate as $donneeFormate) { fputcsv($fp, $donneeFormate, ';'); } fclose($fp); $user = '***'; $pass = '***'; $db = new PDO('mysql:host=***;dbname=***', $user, $pass); $mysqlquery=''; foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE myBoutik_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_product_attribute SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN myBoutik_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; $mysqlquery.=" UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " ';"; } $stmt = $db->prepare($mysqlquery); $stmt->execute(); echo 'done'; //MAJ de la colonne QTE de l'attribut 0 $query = 'SELECT SUM(`quantity`) as total, `id_product` FROM `myBoutik_stock_available` WHERE `id_product_attribute` != 0 GROUP BY `id_product`'; $request = $db->prepare($query); $request->execute(); $results = $request->fetchAll(); $update_query = ''; foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].' AND id_product_attribute = 0;'; } $update = $db->prepare($update_query); $update->execute(); Edited August 24, 2018 by Eolia (see edit history) Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 Comme ça : <?php // Renomme le fichier en web_stock - FLUX001_aaaammjj-hhmm.csv $filename = dirname(__FILE__).'/in/web_stock'; $date=new DateTime(); $dateFormat=$date->format('Ymd-Hi'); $newname="FLUX001_".$dateFormat.".csv"; if (file_exists($filename)) { echo "Le fichier $filename existe. Debut de la synchro<br/>"; } else { echo "Le fichier $filename n'a pas ete synchronise"; die(); } if (rename($filename, dirname(__FILE__).'/in/'.$newname)) { echo "Le fichier $filename a été renommé en $newname.<br/>"; } else { echo "Le fichier $filename n'a pas pu être renommé"; die(); } //sépare les données et crée les colonnes (voir fichier joint pour exemple avec le fichier brut et sa transformation) $donnees=array(); $row = 1; if (($handle = fopen(dirname(__FILE__).'/in/'.$newname, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "|")) !== FALSE) { $donnees[]=$data; } fclose($handle); } $donneesFormate=array(); foreach($donnees as $donnee){ $donneesFormate[]=array($donnee[2], $donnee[3], (int)$donnee[4], (float)$donnee[7]); } //2-c Crée un backup qu'il place dans /echange/in/backup if (rename(dirname(__FILE__).'/in/'.$newname, dirname(__FILE__).'/in/backup/'.$newname)) { echo "Le fichier $newname a été placé dans /echange/in/backup<br/>"; } else { echo "Le fichier $newname n'a pas pu être placé dans /echange/in/backup<br/>"; } //2-d Crée un fichier FLUX002_aaaammjj-hhmm.csv qui ne garde que les colonnes : Fournisseur, Référence, quantité, prix //que le programme stocke dans /echange/out $fp = fopen(dirname(__FILE__).'/out/FLUX002_'.$dateFormat.'.csv', 'w'); foreach ($donneesFormate as $donneeFormate) { fputcsv($fp, $donneeFormate, ';'); } fclose($fp); $user = '***'; $pass = '***'; $db = new PDO('mysql:host=***;dbname=***', $user, $pass); $mysqlquery=''; foreach ($donneesFormate as $donneeFormate) { $mysqlquery.="UPDATE myBoutik_product SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_product_attribute SET quantity = ".$donneeFormate[2].", price = ".$donneeFormate[3]." WHERE reference = '".$donneeFormate[1]."';"; $mysqlquery.="UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_shop AS ps ON ps.id_product = s.id_product INNER JOIN myBoutik_product AS p ON p.id_product = ps.id_product SET s.quantity = ".$donneeFormate[2].", ps.price=".$donneeFormate[3]." WHERE p.reference = '".$donneeFormate[1]."';"; $mysqlquery.=" UPDATE myBoutik_stock_available AS s INNER JOIN myBoutik_product_attribute AS ps ON ps.id_product_attribute = s.id_product_attribute SET s.quantity = ".$donneeFormate[2]." WHERE reference = '". $donneeFormate[1] . " ';"; } var_dump($mysqlquery); $stmt = $db->prepare($mysqlquery); $stmt->execute(); echo 'done'; $query = 'SELECT SUM(`quantity`) as total, `id_product` FROM `myBoutik_stock_available` WHERE `id_product_attribute` != 0 GROUP BY `id_product`'; $request = $db->prepare($query); $request->execute(); $results = $request->fetchAll(); $update_query = ''; foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].' AND id_product_attribute = 0;'; } $update = $db->prepare($update_query); $update->execute(); J'ai les bonnes données pour 2 produits mais pas le total Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 J'ai juste ajouté un ; à foreach($results as $result) { if($result['total'] > 0) $update_query .= 'UPDATE myBoutik_stock_available SET quantity = '.(int)$result['total'].' WHERE id_product = '.(int)$result['id_product'].' AND id_product_attribute = 0;' ; } ça m'insère les bonnes données pour les id_product_attribute 1978 et 1979 mais ajoute 375 pour les autres. Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 Que vous donne cette requete svp ? SELECT SUM(`quantity`) as total, `id_product` FROM `myBoutik_stock_available` WHERE `id_product_attribute` != 0 GROUP BY `id_product` Link to comment Share on other sites More sharing options...
Eolia Posted August 24, 2018 Share Posted August 24, 2018 A mon avis les quantité à 375 ont été mise lors du précédent test. Remettez-les tous à 0 avant de recommencer. Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 Le résultat de la requête en PJ. Le code me donne une erreur 500 Link to comment Share on other sites More sharing options...
SandraNanou Posted August 24, 2018 Author Share Posted August 24, 2018 Pardon pas d'erreur 500 mais les quantités restent à 0 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