Autor Zpráva
tomak
Profil *
Zdravím,

potřeboval bych poradit, jak co nejjednodušeji porovnat xml feed s databází.

Mám soubor neco.xml ve kterém je ID_PRODUKTU např.12345 a v databázi mám ID, které se shoduje s ID_PRUDUKTU, které je v xml.

Otázkou je, jak to porovnat, tak se zobrazily jen výsledky (ID) z databáze, které se ve feedu nenacházejí? (XML Feed obsahuje produkty, které jsou skladem a chci vypsat, které tam nejsou)

Napadlo mě..

<?php

// nactu si xml soubor
$xml = simplexml_load_file('sklad.xml');

// vytvorim si pole do, kterého si ulozim ID z databaze
$hledam_ID = array();

// nactu si vsechny ID z db do pole
  $vysledek = MySQL_Query("SELECT id FROM produkty"); 
              while ($zaznam = MySQL_Fetch_Array($vysledek)){

                          $hledam_ID[] = $zaznam["id"];

  }
  
  // porovnam xml s polem $hledam_ID 
  
?>

Ale jak to porovnat?:) děkuji za odpovědi
Majkl578
Profil
Projdi XML, sesbírej všechny ID a nakonec na databázi polož dotaz s podmínkou WHERE id NOT IN (...) (za tři tečky doplň ty ID, slepené např. pomocí implode).
tomak
Profil *
ještě jsem zapoměl na jedu důležitou věc. V db jsou i produkty, které ID vůbec nemají (cca 30%) takže musím načíst položky které ID mají z db, a pak porovnat s xml feedem.

Tím pádem to co mi radíte nepůjde. Jak to udělat prosím naopak? Díky moc
Kajman
Profil
tomak:
V db jsou i produkty, které ID vůbec nemají... Tím pádem to co mi radíte nepůjde.

Pokud ID bude u nich NULL, tak ten dotaz bude stále stejný.
tomak
Profil *
Tak jsem se to pokusil dát dohromady, ale hlasí mi to chybu... Co dělám špatně? děkuji za odpověď..

<?php

 // nactu si xml soubor
$xml = simplexml_load_file('sklad.xml');

// vytvorim pole pro ID z XML feedu
$IDxml = array();

// nactu do pole vsechny ID (code) z xml feedu
foreach ($xml->product as $item){
             
                        if ($item->code){ 
                            
                            $IDxml[]= $item->code; 
                        
                        }
        }

// pridam mezi cisla carky
$idscarkami = implode(",", $IDxml);

    $vysledek = MySQL_Query("SELECT * FROM product WHERE id NOT IN (".$idscarkami.")"); 
            if ($zaznam = MySQL_Fetch_Array($vysledek)){
                
                echo $zaznam["id"];

            }

?>

Hlasí to chybu "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /data/www/localhost/porovnani/index.php on line 23"
Kajman
Profil
Vypište si chybu dotazu. Třeba jste jen napsal jiný název tabulky než v prvním příspěvku.

Pokud je seznam id příliš velký, může se stát, že dotazem překročíte maximální délku v nastavení serveru. V tom případě si buď změňte konfiguraci serveru, nebo si id postupně (třeba po pár stovkách nebo podle tohoto nastavení) dávejte na několikráte do temporary tabulky a dotaz not in pak udělejte s použitím této tabulky se všemi id z xml souboru.
tomak
Profil *
Výpis chyby. Je to zkrácené. ID_PRODUKTU je asi 5500, mozna tedy i tady je chyba v nastaveni serveru. Bohužel nemám možnost změny. Je to sdílený hosting.

Došlo k chybě v dotazu: SELECT * FROM product WHERE id NOT IN (13001, 14008, 14010, 14015, 14104, 14106, 14107, 14114, 14115, 14116, 14120, 14121, 14144, 14145, 14157, 14175, 14176, 14177, 14179, 14185, 141852, 14186, 141862, 141869, 14192, 14193, 141935, 141936, 141953, 141956, 141959, 14196, 14198, 141986, 141987, 141989, 141995, 14600, 14601, 14610, 14620, 146500-L, 146500-M, 146500-S, 146500-XL, 146501-L, 146501-M, 146501-S, 146501-XL, 146510-L, 146510-M, 146510-S, 146510-XL, 146511-L, 146511-M, 146511-S, 146511-XL, 146570-L, 146570-M, 146570-S, 146570-XS, 146571-L, 146571-M, 146571-S, 146571-XS, 146590-L, 146590-M, 146590-S, 146590-XL, 146595-L, 146595-M, 146595-S, 146595-XL, 14665, 14666, 14670, 146810-L, 146810-M, 146810-S, 146810-XL, 146820-L, 146820-M, 146820-S, 146820-XL, 146830-L, 146830-M, 146830-S, 146830-XL, 14730, 14731, 14732, 14750, 14751, 14754, 14755, 14800, 14801, 14810)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'L-XL, 90608 S-M, 90680, 90681, 90690, 90691, 90692, 90693, 90695, 90696, 90697, ' at line 1

Nebo nemůžou tam vadit jiné znaky než číslo typu: "146820-L" ?

Mohl by jste mi prosím ukázat náznak jak by to mohlo fungovat s tou temporary tabulkou? Děkuji
Kajman
Profil
U 5500 položek bude spíše chyba jen v tom, že stringy musíte dát do apostrofů.
$IDxml[]= "'".mysql_real_escape_string($item->code)."'";
tomak
Profil *
Díky moc, už vše funguje jak má.

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:

0