Autor | Zpráva | ||
---|---|---|---|
jtfcobra Profil |
Prosím o radu jak prectu XML do PHP?
<PROGRAM> <PREDSTAVENI> <CAS> <![CDATA[ 20:00 ]]> </CAS> <NAZEV> <![CDATA[ nehrajeme - zimní prázdniny ]]> </NAZEV> <POPIS> <![CDATA[ ]]> </POPIS> <FOTKY> <FOTKA> <![CDATA[ http://www.xxx.cz/data/predstaveni/39/1.jpg ]]> </FOTKA> </FOTKY> </PREDSTAVENI> <PREDSTAVENI> <CAS> <![CDATA[ 21:00 ]]> </CAS> <NAZEV> <![CDATA[ nehrajeme - zimní prázdniny ]]> </NAZEV> <POPIS> <![CDATA[ ]]> </POPIS> <FOTKY> <FOTKA> <![CDATA[ http://www.xxx.cz/data/predstaveni/39/1.jpg ]]> </FOTKA> </FOTKY> </PREDSTAVENI> <PREDSTAVENI> <CAS> <![CDATA[ 22:00 ]]> </CAS> <NAZEV> <![CDATA[ nehrajeme - zimní prázdniny ]]> </NAZEV> <POPIS> <![CDATA[ ]]> </POPIS> <FOTKY> <FOTKA> <![CDATA[ http://www.xxx.cz/data/predstaveni/39/1.jpg ]]> </FOTKA> </FOTKY> </PREDSTAVENI> </PROGRAM> |
||
juriad Profil |
#2 · Zasláno: 18. 2. 2016, 13:41:45
Návod máš tady: php.net/manual/en/simplexml.examples-basic.php
Zkoušl jsi si sám něco najít, nebo se napřed přece můžeš zeptat? |
||
jtfcobra Profil |
napsal jsem to takle:
<?php $foo = simplexml_load_string( '<PROGRAM><PREDSTAVENI><CAS><![CDATA[ 20:00 ]]></CAS><NAZEV><![CDATA[ nehrajeme - zimní prázdniny ]]></NAZEV><POPIS><![CDATA[ ]]></POPIS><FOTKY><FOTKA><![CDATA[http://www.xxx.cz/data/predstaveni/39/1.jpg]]></FOTKA></FOTKY></PREDSTAVENI><PREDSTAVENI><CAS><![CDATA[ 21:00 ]]></CAS><NAZEV><![CDATA[ nehrajeme - zimní prázdniny ]]></NAZEV><POPIS><![CDATA[ ]]></POPIS><FOTKY><FOTKA><![CDATA[http://www.xxx.cz/data/predstaveni/39/1.jpg]]></FOTKA></FOTKY></PREDSTAVENI></PROGRAM>' ); echo (string) $foo->content; ale to nefunguje |
||
juriad Profil |
#4 · Zasláno: 18. 2. 2016, 14:05:59
Ty tam snad vidíš nějaký element nebo atribut s názvem
content ?
echo (string) $foo->PREDSTAVENI[0]->CAS; |
||
jtfcobra Profil |
Tak takle nakonec
<?php //create DOM document $dom that contain XML $dom = new DOMDocument; $dom->loadXML('<PROGRAM><PREDSTAVENI><CAS><![CDATA[ 20:00 ]]></CAS><NAZEV><![CDATA[ nehrajeme - zimní prázdniny ]]></NAZEV><POPIS><![CDATA[ ]]></POPIS><FOTKY><FOTKA><![CDATA[http://www.xxx.cz/data/predstaveni/39/1.jpg]]></FOTKA></FOTKY></PREDSTAVENI><PREDSTAVENI><CAS><![CDATA[ 21:00 ]]></CAS><NAZEV><![CDATA[ nehrajeme - zimní prázdniny ]]></NAZEV><POPIS><![CDATA[ ]]></POPIS><FOTKY><FOTKA><![CDATA[http://www.xxx.cz/data/predstaveni/39/1.jpg]]></FOTKA></FOTKY></PREDSTAVENI></PROGRAM>'); if (!$dom) { echo 'Error while parsing the document'; exit; } //convert DOM document $dom to object $books $PROGRAM = simplexml_import_dom($dom); //access object $books echo $PROGRAM->PREDSTAVENI[0]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[0]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[0]->POPIS; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->POPIS; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->POPIS; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->POPIS; echo '</br>'; ?> Ale problem je ze to potrebuji cist primo z adresy http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz
|
||
juriad Profil |
A nauč se používat cykly: # stáhneme soubor z adresy do proměnné $xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); # překonvertujeme do UTF-8, pozor Latin-2 jsem pouze odhadl, možná to bude cp1250 $xml = iconv("ISO-8859-2", "UTF-8", $xml); # načteme program z proměnné $PROGRAM = simplexml_load_string($xml); foreach($PROGRAM->PREDSTAVENI as $predstaveni) { echo $predstaveni->CAS; echo '</br>'; echo $predstaveni->NAZEV; echo '</br>'; echo $predstaveni->POPIS; echo '</br>'; echo '</br>'; } |
||
jtfcobra Profil |
Uz to mam
<?php # stáhneme soubor z adresy do proměnné $xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); # překonvertujeme do UTF-8, pozor Latin-2 jsem pouze odhadl, možná to bude cp1250 $xml = iconv("ISO-8859-2", "UTF-8", $xml); # načteme program z proměnné $PROGRAM = simplexml_load_string($xml); //cteni programu echo $PROGRAM->PREDSTAVENI[0]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[0]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[0]->POPIS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[0]->FOTKY->FOTKA; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->POPIS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[1]->FOTKY->FOTKA; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->POPIS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[2]->FOTKY->FOTKA; echo '</br>'; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->CAS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->NAZEV; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->POPIS; echo '</br>'; echo $PROGRAM->PREDSTAVENI[3]->FOTKY->FOTKA; echo '</br>'; // krizikovafontana.dnes - cas - nazev - popis - foto ?> |
||
juriad Profil |
jtfcobra:
Samozřejmě, že umí přistoupit k fotkám. Autor předpokládá, že každé představení může mít několik fotek. Jsou proto obalené elementem FOTKY. Pozor, pokud by představení nemělo žádnou fotku, je možné, že element FOTKY bude úplně chybět. Nejlépe kontaktuj autora a požádej jej o schéma toho xml. echo $PROGRAM->PREDSTAVENI[0]->FOTKY->FOTKA[0]; foreach($PROGRAM->PREDSTAVENI[0]->FOTKY->FOTKA as fotka) { echo $fotka, '<br>'; } Až si budeš navrhovat databázovou strukturu, musíš pro fotky vytvořit extra tabulku. |
||
jtfcobra Profil |
No premyslim ze to udelam takto
id,datum,cas,nazev,popis,fotka Ale presmyslim jak to napsat v php abych treba udelal cron kazdych 5 minut a mel na aktualni den...prvni into a pak update.... fotka je tam vzdy jen jedna uz sem to vymyslel mne staci vzdy jen aktualni den tak vycistim tabulku a pak jen pridam |
||
juriad Profil |
Ono je otázkou, zda to vůbec potrebuješ ukládat do databáze, když tě zajímá jen aktuální den.
Nestačilo by soubor jen stáhnout a uložit na disk, a později jej jen zpracovat pomocí simplexml? Ten soubor bude maličký, takže to bude rychlé. |
||
jtfcobra Profil |
#11 · Zasláno: 18. 2. 2016, 15:12:22
Napsal jsem to takto ale nefunguje to ...
A potrebuji to mysql protoze pak to bude do iOS klienta , a Android klienta <?php // Komunikace $hostname_test = ""; $database_test = "krizikovafontana"; $username_test = ""; $password_test = ""; # stáhneme soubor z adresy do proměnné $xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); # překonvertujeme do UTF-8, pozor Latin-2 jsem pouze odhadl, možná to bude cp1250 $xml = iconv("ISO-8859-2", "UTF-8", $xml); # načteme program z proměnné $PROGRAM = simplexml_load_string($xml); foreach($PROGRAM->PREDSTAVENI as $predstaveni) { $cas=$predstaveni->CAS; $nazev=$predstaveni->NAZEV; $popis=$predstaveni->POPIS; $fotka=$predstaveni->FOTKY->FOTKA; echo $cas; $komunikace = mysql_pconnect($hostname_test, $username_test, $password_test) or trigger_error( mysql_error(),E_USER_ERROR); $komunikace = mysql_query("INSERT INTO krizikovafontana.dnes(datum, cas, nazev, popis, fotka ) VALUES(now(),'$cas','$nazev','$popis,'$fotky')"); } mysql_close(); ?> |
||
anonymníí Profil * |
#12 · Zasláno: 18. 2. 2016, 15:15:11
jtfcobra:
Proč si nevypíšeš mysql_error i za tím druhým dotazem? Pravděpodobně tam chybí volba databáze, mysql_select_db . O nevhodnosti užívání mysql ti povědí jiní, nebo si něco přečti.
Dále, zapomínáš escapovat vstup do DB. |
||
jtfcobra Profil |
$xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); # překonvertujeme do UTF-8, pozor Latin-2 jsem pouze odhadl, možná to bude cp1250 $xml = iconv("ISO-8859-2", "UTF-8", $xml); # načteme program z proměnné $PROGRAM = simplexml_load_string($xml); foreach($PROGRAM->PREDSTAVENI as $predstaveni) { $cas=$predstaveni->CAS; $nazev=$predstaveni->NAZEV; $popis=$predstaveni->POPIS; $fotka=$predstaveni->FOTKY->FOTKA; echo $fotka; $komunikace = mysql_pconnect($hostname_test, $username_test, $password_test) or trigger_error(mysql_error(),E_USER_ERROR); $komunikace = mysql_query("INSERT INTO krizikovafontana.predstaveni (datum, cas, nazev, popis, fotka ) VALUES(now(),'$cas','$nazev','$popis,'$fotky')"); if($komunikace){ echo "</br>Ulozeno</br>"; } else { echo "</br>Ulozeni se nepodarilo!</br>"; } } mysql_close(); Komunikuje ale neuklada |
||
juriad Profil |
#14 · Zasláno: 18. 2. 2016, 15:25:26
jtfcobra:
1. určitě neprováděj pconnect v cyklu, přesuň jej ven. Proměnná se obvykle nazývá $spojeni , použij mysqli_connect.
2. Na řádcích 15 - 18 přidej explicitní přetypování na string: $cas = (string) $predstaveni->CAS;
3. Výsledek query ulož do jiné proměnné, nebo nemusíš do žádné, stejně s ní nic neděláš. 4. Musíš správně řešit escapování dat. Vše jsou to řetězce, musíš na ně použít funkci mysqli_real_escape_string před vložením do SQL dotazu. 5. mysql_close není nutné skoro nikdy, můžeš na něj zapomenout. |
||
jtfcobra Profil |
#15 · Zasláno: 18. 2. 2016, 15:41:13
Tak jsem to rozchodil ted to musim vycistit
<?php // Komunikace $db = mysql_connect($hostname_test, $username_test, $password_test); mysql_select_db($database_test,$db); $komunikace = mysql_query("DELETE FROM krizikovafontana.predstaveni"); if($komunikace){ echo "</br>Promazano</br>"; } else { echo "</br>Promazani se nepodarilo!</br>"; } # stáhneme soubor z adresy do proměnné $xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); # překonvertujeme do UTF-8, pozor Latin-2 jsem pouze odhadl, možná to bude cp1250 $xml = iconv("ISO-8859-2", "UTF-8", $xml); # načteme program z proměnné $PROGRAM = simplexml_load_string($xml); foreach($PROGRAM->PREDSTAVENI as $predstaveni) { $cas=$predstaveni->CAS; $nazev=$predstaveni->NAZEV; $popis=$predstaveni->POPIS; $fotka=$predstaveni->FOTKY->FOTKA; echo $cas.' '.$nazev; $komunikace = mysql_query("INSERT INTO krizikovafontana.predstaveni (datum, cas, nazev, popis, fotka ) VALUES(now(),'$cas','$nazev','$popis','$fotky')"); if($komunikace){ echo "</br>Ulozeno</br>"; } else { echo "</br>Ulozeni se nepodarilo!</br>"; } } mysql_close(); ?> |
||
juriad Profil |
#16 · Zasláno: 18. 2. 2016, 15:42:13
Celý funkční skript:
<?php $xml = file_get_contents('http://www.krizikovafontana.cz/export/program/export.php?type=xml_dnes&jazyk=cz'); $xml = iconv("ISO-8859-2", "UTF-8", $xml); $PROGRAM = simplexml_load_string($xml); $spojeni = mysqli_connect('localhost', 'root', 'root', 'krizikovafontana'); foreach($PROGRAM->PREDSTAVENI as $predstaveni) { # toto slouží k tomu, aby $cas byl opravdu ve formátu času, přece nebudeš slepě věřit $cas = (string) $predstaveni->CAS; @list($hodiny, $minuty, $sekundy) = explode(':', $cas); $cas = date("H:i:s", mktime(+$hodiny, +$minuty, +$sekundy)); $nazev = (string) $predstaveni->NAZEV; $popis = (string) $predstaveni->POPIS; $fotka = (string) $predstaveni->FOTKY->FOTKA; $insert = mysqli_query($spojeni, "INSERT INTO predstaveni (datum, cas, nazev, popis, fotka) VALUES ( '" . date("Y-m-d") . "', '" . $cas . "', '" . mysqli_real_escape_string($spojeni, $nazev) . "', '" . mysqli_real_escape_string($spojeni, $popis) . "', '" . mysqli_real_escape_string($spojeni, $fotka) . "' )"); if ($insert) { echo "Ulozeno"; } else { echo "Ulozeni se nepodarilo!"; } } Vloží do tabulky: CREATE TABLE `predstaveni` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datum` date DEFAULT NULL, `cas` time DEFAULT NULL, `nazev` varchar(200) DEFAULT NULL, `popis` text, `fotka` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 |
||
Časová prodleva: 9 let
|
0