Autor Zpráva
Pop
Profil *
Zdravím,
měl jsem problém, který jsem popsal zde. Nikdo mi však nedokázal pomoci. Chtěl bych se optat a předem upozorňuji, že jsem hledal. Jelikož import řeším poprvé, tak na nějaký návod, nenašel jsem žádný, který by fungoval do více stupňů. Pokud možno, ne OOP.
Takto nějak vypadá:
<soubor info="">
<menu nazev="" nazev2="" nazev3="">
<neco nazev4="">
<neco nazev4="">
</menu>
</soubor>
Těch menu s něco je tam samozřejmě hodně a v uvozovkách je info, které taky potřebuji. Tudíž bych potřeboval, aby se mi vytvořil řádek v DB na každý <neco> a do dalších sloupců se uložilo nazev,nazev2,nazev3,nazev4. Stačí odkaz na nějaký návod.
Děkuji moc, Pop.
Joker
Profil
Pop:
Pokud možno, ne OOP.
ne-OOP nevím, ale objektových způsobů čtení XML nabízí PHP hned několik, třeba SimpleXML nebo XMLReader.
Pop
Profil *
Tak jsem se moc nepohnul. Při mé struktuře, kterou jsem zjednodušil
<menu jmeno="udaj">
<neco nazev="udaj2/>
<neco nazev="udaj3/>
<neco nazev="udaj4/>
<neco nazev="udaj5/>
<neco nazev="udaj6/>
</menu>
Mělo by vyjít 5 řádků, v názvu údaj2 až 6 a ve jméně vždy údaj

Buď mi z toho vyšel jen jeden řádek bez se jménem "udaj", ale nazev chyběl.
A nebo mi z toho vyšlo řádků pět, kde název byl v pořádku, ale jméno chybělo ..
mimochodec
Profil
Pop:
Ono se to prostě úplně samo neudělá. Položka "menu" je jeden uzel na nějaké úrovni, položky "neco" jsou o úroveň níž. Nejakým foreach projdi tu nejvyšší úroveň, vnořeným foreach vždycky těch pár podpoložek. Aspoň takhle nějak si to pamatuju.

Kromě toho:
aby se mi vytvořil řádek v DB na každý <neco> a do dalších sloupců se uložilo nazev,nazev2,nazev3,nazev4.

A co když těch položek bude 5? Nebo 50?
Pop
Profil *
mimochodec:
Tak vždycky když to zkouším, tak mě zradí to, že mám ty údaje v tagu a ne mezi tagy. Ve všech příkladech, které jsem zatím nalezl byli jejich údaje mezi tagy (např <name>Karl</name>, nikdy nebylo <osoba jmeno="karl"/>)
A k tomu počtu, řádků by mělo celkově vyjít přes 6000
Keeehi
Profil
Pop:
A k tomu počtu, řádků by mělo celkově vyjít přes 6000
mimochodec narážel na nejspíše na špatný návrh databáze.
mimochodec
Profil
Pop:
Tak vždycky když to zkouším, tak mě zradí to, že mám ty údaje v tagu a ne mezi tagy.

http://www.php.net/manual/en/simplexmlelement.attributes.php

A k tomu počtu, řádků by mělo celkově vyjít přes 6000
Keeehi mi ušetřil čas, díky.
Pop
Profil *
Keeehi:
Tyto nazev1,2 atd. jsem dal sem jen pro příklad. V databázi mám id, nazev, kraj. Stejně se pak jmenují v tom tagu, údaje jsou smysluplné názvy.

mimochodec:
Ten odkaz si prostuduji, vypadá to na správnou notu :)

Zatím děkuji všem
Keeehi
Profil
Pop:
V databázi mám id, nazev, kraj. Stejně se pak jmenují v tom tagu, údaje jsou smysluplné názvy
A do příkladu jsi to napsat nemohl? Čím konkrétněji případ popíšeš, tím lépe a přesněji se pak radí.
Pop
Profil *
Zdravím, teď mám tedy kód, který dokáže vypsat i atributy...
$xml = simplexml_load_string($string);
foreach($xml->oblast[0]->attributes() as $kraj) {
    echo $kraj."<br>";
    foreach($xml->oblast[0]->obec[0]->attributes() as $nazev) {
    echo $nazev."<br>";   
    }        
}
Nyní už jen do toho stačí dát zápis do databáze, ale nenapadá mě, potřebuji mít pomocné číslo, které se po průchodu přičte, ale jak zjistit, že už je poslední, takže už nepokračovat? Popř. že je poslední, takže přičíst jiné číslo, které bude určovat nadkategorii ..
mimochodec
Profil
Pop:
Nyní už jen do toho stačí dát zápis do databáze, ale nenapadá mě, potřebuji mít pomocné číslo, které se po průchodu přičte, ale jak zjistit, že už je poslední, takže už nepokračovat? Popř. že je poslední, takže přičíst jiné číslo, které bude určovat nadkategorii ..

Můžeš to uchovávat v jedné tabulce:
$xml = simplexml_load_string($string);
foreach($xml->oblast[0]->attributes() as $kraj) {
  echo $kraj."<br>";
  $sql = "INSERT INTO table (uroven, rodic, textpolozky) VALUES (0, 0, '".$kraj."')";
  mysql_query($sql);
  $rodic= mysql_insert_id();

  foreach($xml->oblast[0]->obec[0]->attributes() as $nazev) {
    echo $nazev."<br>";
    $sql = "INSERT INTO table (uroven, rodic, textpolozky) VALUES (1, ".$rodic.", '".$nazev."')";
    mysql_query($sql);
  }
}

Nebo jestli jde o strukturu krajů a obcí, vytvořil bych spíš dvě tabulky a obejdeš se bez toho sloupce "uroven". Nezapomeň ale, že jestli to budeš používat opakovaně, musíš ošetřit, aby se ti nevytvářely duplicitní položky.
Pop
Profil *
Jde o databázi obcí s kraji, strukturu mám pouze ID (AI), nazev, kraj. Myslel jsem tedy, že by mohlo fungovat toto řešení.
Avšak místo posloupného zapsání zapíše jen jeden řádek.
$xml = simplexml_load_string($string);
foreach($xml->oblast[0]->attributes() as $kraj) {
  echo $kraj."<br>";
 
  foreach($xml->oblast[0]->obec[0]->attributes() as $nazev) {
    echo $nazev."<br>";
    $sql = "INSERT INTO obce (id, nazev, kraj) VALUES ('', '".$nazev."', '".$kraj."')";
    mysql_query($sql);
  }
}
mimochodec
Profil
Vyhoď z toho to nadbytečné vkládání prázdné hodnoty do ID. Ale chyba v tom nebude. Určitě ty dotazy proběhnou? Vypíšou se ty názvy obcí?
Pop
Profil *
Právě že ani ty ne, vypíše se jen jedna obec s krajem zapíše a dál nepokračuje.
panther
Profil
Pop:
vypíše se jen jedna obec s krajem zapíše a dál nepokračuje.
nechce se mi procházet celé vlákno, ale tipl bych si, že to projde jeden záznam, protože ho dáváš foreachi.

foreach($xml->oblast[0]->obec[0]->attributes() as $nazev) {...}
Pop
Profil *
I když dám pryč [0], vypisuje jen jedno.
juriad
Profil
$xml = simplexml_load_string($string);
foreach($xml->oblast as $oblast) {
  $kraj = $oblast->attributes()[0];
  echo $kraj."<br>";
 
  foreach($oblast->obec as $obec) {
    $nazev = $obec->attributes()[0];
    echo $nazev."<br>";
    $sql = "INSERT INTO obce (id, nazev, kraj) VALUES ('', '".$nazev."', '".$kraj."')";
    mysql_query($sql);
  }
}

Aha, attributes() nevrací pole; nemám teď čas dořešit, ale princip by měl být správný.
Pop
Profil *
juriad:
Ta [0] za atributem hlásila chybu, bez ní ale šlape výborně.
Děkuji moc všem.


Pozdě :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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