Jump to content

[Resolu] [DEV Php] Importer CSV Mise à jour stock


yvanb

Recommended Posts

Bonjour à tous,

je suis en train de développer un petit script qui me permet de mettre à jour mon stock d’après celui de mon grossiste, comme je suis en Dropshipping, cela m'arrange pas mal....

 

Mon script fonctionne correctement, cela doit être coder comme un cochon, certes, je débute, mais il fonctionne.... enfin presque, car je bute sur un truc.... Le timeout de php !

 

Voici mon code :

<?php
include("config.php");
 $sql  = "TRUNCATE TABLE ps_stock_maj ";
mysql_query($sql);
 $sq  = "TRUNCATE TABLE ps_stock_ref ";
mysql_query($sq);

$fp = fopen("mon.csv", "r");
while ($data = fgetcsv($fp, 1, ";"))
{  
$insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')";
$insertresults = mysql_query($insert) or die(mysql_error());
}
fclose ($fp);
$query = "SELECT * FROM ps_product_attribute AS a LEFT JOIN ps_stock_available AS b ON a.id_product_attribute = b.id_product_attribute";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){

$inser = "insert into ps_stock_ref (id_product_attribute, reference, quantity) values ($row[id_product_attribute], '$row[reference]','$row[quantity]')";
$insertresults = mysql_query($inser) or die(mysql_error());
}
$requete=mysql_query("SELECT * FROM ps_stock_ref AS a LEFT JOIN ps_stock_maj AS b ON a.reference = b.reference");
$nombrelignes = mysql_numrows($requete);
for ($i=0;$i<$nombrelignes;$i++) {

$id_product_attribute = mysql_result($requete,$i,"id_product_attribute");
$reference = mysql_result($requete,$i,"b.reference");
$quantity = mysql_result($requete,$i,"b.quantity");
$inser = "UPDATE ps_stock_available SET  quantity = '$quantity' WHERE id_product_attribute = '$id_product_attribute' ";
$insertresults = mysql_query($inser) or die(mysql_error());
}
mysql_close();
?>

 

Suite à ce problème de timeout, j'ai essayé de mettre un sleep :

while ($data = fgetcsv($fp, 1, ";"))
{
sleep(2);
$insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')";
$insertresults = mysql_query($insert) or die(mysql_error());
}
fclose ($fp);

 

Mais petit bug, il sleep tellement bien qu'il redémarre pas la boucle (pour continuer l'import), ou cela change rien et j'ai toujours le timeout... Sachant que le fichier fait 1.07 Mo et qu'il y à 11868 lignes à importer...

 

Pour infos, ce script récupère le contenu du fichier .csv, l'importe dans une table temporaire, fait la même choses pour les déclinaisons en récupérant la réf et la quantité, il compare les deux, puis, si la réf existe, modifie les quantités directement dans la table ps_stock_available, et donc, cela me met à jour mes quantité. Je dois faire la même choses pour les produits qui n'on pas de déclinaisons, pas très compliqué à faire.

 

Si une âme charitable passe par là, je voudrais bien un peu d'aide pour cette histoire de pause et reprise de la boucle.

 

Merci à tous ;)

Edited by yvanb (see edit history)
Link to comment
Share on other sites

Bonjour à tous,

je suis en train de développer un petit script qui me permet de mettre à jour mon stock d’après celui de mon grossiste, comme je suis en Dropshipping, cela m'arrange pas mal....

 

Mon script fonctionne correctement, cela doit être coder comme un cochon, certes, je débute, mais il fonctionne.... enfin presque, car je bute sur un truc.... Le timeout de php !

 

Voici mon code :

<?php
include("config.php");
 $sql  = "TRUNCATE TABLE ps_stock_maj ";
mysql_query($sql);
 $sq  = "TRUNCATE TABLE ps_stock_ref ";
mysql_query($sq);

$fp = fopen("mon.csv", "r");
while ($data = fgetcsv($fp, 1, ";"))
{  
$insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')";
$insertresults = mysql_query($insert) or die(mysql_error());
}
fclose ($fp);
$query = "SELECT * FROM ps_product_attribute AS a LEFT JOIN ps_stock_available AS b ON a.id_product_attribute = b.id_product_attribute";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){

$inser = "insert into ps_stock_ref (id_product_attribute, reference, quantity) values ($row[id_product_attribute], '$row[reference]','$row[quantity]')";
$insertresults = mysql_query($inser) or die(mysql_error());
}
$requete=mysql_query("SELECT * FROM ps_stock_ref AS a LEFT JOIN ps_stock_maj AS b ON a.reference = b.reference");
$nombrelignes = mysql_numrows($requete);
for ($i=0;$i<$nombrelignes;$i++) {

$id_product_attribute = mysql_result($requete,$i,"id_product_attribute");
$reference = mysql_result($requete,$i,"b.reference");
$quantity = mysql_result($requete,$i,"b.quantity");
$inser = "UPDATE ps_stock_available SET  quantity = '$quantity' WHERE id_product_attribute = '$id_product_attribute' ";
$insertresults = mysql_query($inser) or die(mysql_error());
}
mysql_close();
?>

 

Suite à ce problème de timeout, j'ai essayé de mettre un sleep :

while ($data = fgetcsv($fp, 1, ";"))
{
sleep(2);
$insert = "insert into ps_stock_maj (reference, quantity) values ('$data[1]','$data[3]')";
$insertresults = mysql_query($insert) or die(mysql_error());
}
fclose ($fp);

 

Mais petit bug, il sleep tellement bien qu'il redémarre pas la boucle (pour continuer l'import), ou cela change rien et j'ai toujours le timeout... Sachant que le fichier fait 1.07 Mo et qu'il y à 11868 lignes à importer...

 

Pour infos, ce script récupère le contenu du fichier .csv, l'importe dans une table temporaire, fait la même choses pour les déclinaisons en récupérant la réf et la quantité, il compare les deux, puis, si la réf existe, modifie les quantités directement dans la table ps_stock_available, et donc, cela me met à jour mes quantité. Je dois faire la même choses pour les produits qui n'on pas de déclinaisons, pas très compliqué à faire.

 

Si une âme charitable passe par là, je voudrais bien un peu d'aide pour cette histoire de pause et reprise de la boucle.

 

Merci à tous ;)

 

Salut,

Je réponds vraiment à la louche et sans être entré dans les détails de ton post car je suis en congés et je ne fais que passer :)

Mais à la louche donc pour outrepasser le max_execution_time de php rien ne vaut un bon script ajax.

En gros à chaque appel depuis un script js , tu transmet un n° de départ et un nb d'enregistrements à traiter (lignes dans ton cas).

Le php récupère ça en get et traite xx lignes à la fois.

Il retourne le numéro de la prochaine ligne par ex et ton js peut boucler...

Link to comment
Share on other sites

Salut, et oui effectivement c'est une solution pas bête du tout, mais finalement j'ai fini par trouvé, il me manquais juste ceci dans ma boucle

set_time_limit(10);

Du coup, php fait une "micro" pause toutes les 10s se qui "réinitialise" le timeout de 30s (par défaut) de php. Comme php ne compte pas le nombre de requête durant le calcul du timeout, cela est considéré comme une nouvelle requête toutes les 10s.

 

Merci pour ton aide ;)

Me reste plus qu'à mettre une progress bar pour connaitre l'avancement ;)

Link to comment
Share on other sites

  • 1 year later...

Salut, et oui effectivement c'est une solution pas bête du tout, mais finalement j'ai fini par trouvé, il me manquais juste ceci dans ma boucle

set_time_limit(10);
Du coup, php fait une "micro" pause toutes les 10s se qui "réinitialise" le timeout de 30s (par défaut) de php. Comme php ne compte pas le nombre de requête durant le calcul du timeout, cela est considéré comme une nouvelle requête toutes les 10s.

 

Merci pour ton aide ;)

Me reste plus qu'à mettre une progress bar pour connaitre l'avancement ;)

 

 

Bonjour

 

Est-ce que ton code marche pour une version 1.6?

Merci d'avance

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...