Autor | Zpráva | ||
---|---|---|---|
Pop Profil * |
#1 · Zasláno: 25. 8. 2012, 22:32:02
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 |
#2 · Zasláno: 26. 8. 2012, 11:36:52
|
||
Pop Profil * |
#3 · Zasláno: 26. 8. 2012, 13:42:10
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 |
#4 · Zasláno: 26. 8. 2012, 13:48:55
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 * |
#5 · Zasláno: 26. 8. 2012, 14:13:27
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 |
#7 · Zasláno: 26. 8. 2012, 14:28:08
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 * |
#8 · Zasláno: 26. 8. 2012, 14:32:19
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 |
#9 · Zasláno: 26. 8. 2012, 14:38:39
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 * |
#10 · Zasláno: 26. 8. 2012, 18:06:00
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>"; } } |
||
mimochodec Profil |
#11 · Zasláno: 26. 8. 2012, 19:41:36
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 * |
#12 · Zasláno: 26. 8. 2012, 20:21:35
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 |
#13 · Zasláno: 26. 8. 2012, 20:35:11
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 * |
#14 · Zasláno: 26. 8. 2012, 20:39:25
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áš foreach i.
foreach($xml->oblast[0]->obec[0]->attributes() as $nazev) {...} |
||
Pop Profil * |
#16 · Zasláno: 26. 8. 2012, 20:47:06
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 * |
#18 · Zasláno: 26. 8. 2012, 21:05:00 · Upravil/a: Pop
juriad:
Ta [0] za atributem hlásila chybu, bez ní ale šlape výborně. Děkuji moc všem. Pozdě :) |
||
Časová prodleva: 12 let
|
0