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
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
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
Použij funkci simplexml_load_file místo simplexml_import_dom, a předej jí adresu jako první parametr. XML je ve špatném kódování, musíš to obejít pomocí file_get_contents a iconv. Tím můžeš celou tu šaškárnu s DOMem (řádky 2 - 8) zrušit.

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];
K dalším se pak dostaneš pomocí cyklu:
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
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 *
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
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
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
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

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: