Autor | Zpráva | ||
---|---|---|---|
stryzovsky Profil |
#1 · Zasláno: 2. 8. 2013, 12:36:49
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"); } Předem děkuji za rady a nápady. |
||
Kajman Profil |
#2 · Zasláno: 2. 8. 2013, 12:48:26
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 |
#3 · Zasláno: 2. 8. 2013, 13:31:53
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 |
#4 · Zasláno: 2. 8. 2013, 13:36:34
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 |
#5 · Zasláno: 2. 8. 2013, 13:41:42
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 |
#6 · Zasláno: 2. 8. 2013, 15:38:10
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 |
#7 · Zasláno: 4. 8. 2013, 18:01:57
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 |
#8 · Zasláno: 4. 8. 2013, 18:16:17
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 |
#9 · Zasláno: 4. 8. 2013, 18:30:40
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. |
||
Časová prodleva: 11 let
|
0