Autor Zpráva
stryzovsky
Profil
Zdravím všechny,
mám takový malý problém. Provozuji eshop a každých 10 minut se mi aktualizují skladové zásoby z xml feedu dodavatele.
Vše funguje skvěle, až na jeden problém. Zjistil jsem, že když dodavatel vyprodá zboží, které už nebude, v xml feedu se tato položka vůbec nezobrazí a na mém eshopu zůstane viset jeden kus.
Potřeboval bych tedy poradit, jak ovlivnit ty řádky v db, které se v xml feedu nevyskytují. Pro lepší pochopení přikládam část kodu:

foreach ($xml->PRODUCT as $v)   
         {      
          
          $sku = $v->CATNUM;
          $new_quantity = $v->QUANTITY;

  
$result = mysql_query("Select entity_id from catalog_product_entity where sku='".$sku."' limit 1"); 
$i = mysql_fetch_array($result);
$product_id =  $i['entity_id'];

mysql_query("UPDATE cataloginventory_stock_item item_stock, cataloginventory_stock_status status_stock 
SET item_stock.qty = '$new_quantity', item_stock.is_in_stock = IF('$new_quantity'>0, 1,0), status_stock.qty = '$new_quantity',
 status_stock.stock_status = IF('$new_quantity'>0, 1,0) WHERE item_stock.product_id = '$product_id' 
 AND item_stock.product_id = status_stock.product_id");      

         }
Zkoušel jsem nejdříve přepsat celý sklad na nulu a pak znovu přepsat pouze hodnoty, které jsou v xml feedu. Takto napsaný skript byl sice funkční, ale jeho zpracování trvalo dlouho, takže se někdy ukončil dříve, než byl dokončen.

Předem děkuji za rady a nápady.
Kajman
Profil
Např. si můžete $product_id ukládat do php pole a po dokončení cyklu udělat
update ... where item_stock.product_id not in (seznam, cisel, co, se, zpracovala) ...

Pokud těch položek bývá více než tisíce, tak bych asi místo pole dával hodnoty do dočasné mysql tabulky a z ní pak udělal jeden update pro nalezené hodnoty a druhý update pro nenalezené.
stryzovsky
Profil
A nešlo by to vyřešit nějak takto?
Vrátí mi to ale pouze jedno číslo, které se opakuje dokola.

foreach ($xml->PRODUCT as $v)   
         {      
          
          $sku = $v->CATNUM;
          $new_quantity = $v->QUANTITY;

mysql_query("Select entity_id from catalog_product_entity where sku not in('".$sku."') limit 1"); 
 
Kcko
Profil
Kajman:
Pokud těch položek bývá více než tisíce, tak bych asi místo pole dával hodnoty do dočasné mysql tabulky
Jsi si jist, že to bude řádově rychlejší?
stryzovsky
Profil
Těch položek je do dvou tisíc.

No nic, zkusím tedy update ... where item_stock.product_id not in (seznam, cisel, co, se, zpracovala) ... a dám vědět co a jak.
Zatím díky
Kajman
Profil
Kcko:
Jsi si jist, že to bude řádově rychlejší?

Jde o to, že pokud bude seznam id příliš dlouhý, může dotaz překročit maximální povolenou délku znaků.
stryzovsky
Profil
Zdravím, tak vymyslel jsem to takhle, ale pořád se mi vypíše pouze první položka. Už mě nic nenapadá.

// vytvorim pole pro sku z XML feedu
$sku_xml = array();

// nactu do pole vsechny sku z xml feedu
foreach ($xml->PRODUCT as $v)
{
$sku_xml[]= "'".mysql_real_escape_string($v->CATNUM)."'";

// pridam mezi sku carky
$skuscarkami = implode(",", $sku_xml);
$vysledek = MySQL_Query("SELECT * FROM catalog_product_entity WHERE sku NOT IN (".$skuscarkami.")"); 
$zaznam = MySQL_Fetch_Array($vysledek);       
}
echo $zaznam["sku"];
            
//ukončení připojení k db
mysql_close($db_spojeni);
Tori
Profil
stryzovsky:
pořád se mi vypíše pouze první položka
No ano, pole $zaznam se při každé iteraci přepíše, takže pracujete jen s výsledkem posledního dotazu. A navíc mysql_fetch_array vrací vždy jeden řádek dat, při dalším volání další řádek. Pro začátek bych přesunula závorku z ř.13 na ř.8.
stryzovsky
Profil
Můžete mě prosím trochu popostrčit? u jsem z toho nějak domotaný.
Přesunul jsem tu závorku a výsledek stejný.
Kajman
Profil
stryzovsky:
Pole $sku_xml bude kompletní až po dokončení for cyklu. Takže i jeho zpracování pomocí update má být až po dokončení for cyklu, jak je psáno v [#2] i [#8]. Navíc bude lepší ukládat do toho pole zpracované $product_id, ať je možno použít obdobný update a nemusíte připojovat další tabulku.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: