Autor | Zpráva | ||
---|---|---|---|
jefitto44 Profil |
#1 · Zasláno: 24. 4. 2014, 21:36:23
Mám vytvorený určitý skript, ktorého úlohou je vliezť do databázy produktov, vybrakovať z nej všetky veci, zoradiť do xml kódu a vypísať. Problém je ten, že to dokážem vypísať iba do daného súboru, teda k samotnému xml sa dostanem výlučne vtedy, ak si nechám zobraziť stránku so skriptom a v jej zdrojovom kóde sa nachádza to XML presne také, aké by som chcel v samostatnom súbore. Moja otázka je - čo mám na to použiť a ako to mám použiť, aby mi toto xml-ko nevypísalo do materského súboru, ale aby to vytvorilo v roote nový súbor? Napísať mi funkciu, classu, ani niečo podobné mi nestačí, nakoľko som dosť lama. Samozrejme, snažím sa googliť.
Zatiaľ som sa dogooglil k tomu, že sa dá vytvoriť nejaký súbor pomocou php create file, tam som však aj skončil. Potreboval by som vedieť nejaké hlavičky, ako by mal vyzerať riadok (ide najmä o syntax), ktorý súbor vytvorí a pomenuje a ako do toho súboru dostať obsah. Navyše, ten vytvorený súbor musí byť vo formáte .xml Za každú pomoc veľmi pekne ďakujem a prajem všetko dobre ;) |
||
juriad Profil |
#2 · Zasláno: 24. 4. 2014, 21:46:03
Ukaž kód, kterým to xml vytváříš.
Funkce na ukládání do souboru je file_put_contents. |
||
jefitto44 Profil |
#3 · Zasláno: 25. 4. 2014, 06:12:31 · Upravil/a: jefitto44
echo '<?xml version="1.0" encoding="UTF-8"?> <eshop>'; //Select kategórií $querycat = 'SELECT * FROM `TABLE_PREFIX` WHERE nadradena_skupina = 0 '; $Resultcat = mysql_query($querycat); while($Rowcat=mysql_fetch_assoc($Resultcat)) { echo '<Navigation Description="'.$Rowcat["nazov"].'">'; $querycat2 = 'SELECT * FROM `TABLE_PREFIX` WHERE nadradena_skupina = '.$Rowcat["tovarova_skupina_id"]; $Resultcat2 = mysql_query($querycat2); while($Rowcat2=mysql_fetch_assoc($Resultcat2)) { echo '<Navigation Description="'.$Rowcat2["nazov"].'">'; $querycat3 = 'SELECT * FROM `TABLE_PREFIX` WHERE nadradena_skupina = '.$Rowcat2["tovarova_skupina_id"]; $Resultcat3 = mysql_query($querycat3); while($Rowcat3=mysql_fetch_assoc($Resultcat3)) { echo '<Navigation Description="'.$Rowcat3["nazov"].'">'; echo '<Items>'; $query = 'SELECT * FROM `TABLE_PREFIX` WHERE tovarova_skupina_id = '.$Rowcat3["tovarova_skupina_id"]; $Result = mysql_query($query); while ($Row=mysql_fetch_assoc($Result)) { echo '<Item Description="'.$Row["popis"].'" Price="'.$Row["cena_1"].'" ImgUrl="'.$Row["tovar_id"].'.jpg" Url="'.$Row["tovarova_skupina_id"].'" Unit="'.$Row["merna_jednotka"].'" Code="'.$Row["identif_kod"].'" Name="'.$Row[nazov].'"/>'; } echo '</Items>'; echo '</Navigation>'; } echo '</Navigation>'; } echo '</Navigation>'; } echo '</eshop>'; Skript vchádza do databázy, vyberá kategórie a jednotlivé tovary a vytvorí z nich xml. Funguje to, vytvorí xml, lenže toto všetko, potrebujem zapísať do súboru, nie do zdroja. Poslúži na to ten file put contents? Neviem, či tomu dobre rozumiem, ale asi by to malo byť takto: int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) $flags, to som nepochopil, asi nechám 0. resource $context taktiež neviem na čo je dobré. Ďakujem |
||
jefitto44 Profil |
#4 · Zasláno: 25. 4. 2014, 08:14:24
Funguje to, no normálne som sa potešil :) Ďakujem veľmi pekne.
Ešte by som mal jednu otázku... niekedy sa stane, že v popise, alebo v názve produktu je apostrof, alebo úvodzovka. Ja to samozrejme potrebujem dostať preč, resp. escapovať. Ako spravím v tom cykle, aby to pred všetky ", alebo ' pridalo spätné lomítko \? |
||
juriad Profil |
Já bych to celé řešil pomocí knihovny pro práci s xml; tato knihovna se postará o veškeré správné escapování.
<?php # jeden dotaz, který v řádku obsahuje všechny informace o tovarech # všimni si řazení, které zajistí, že celá jedna skupina bude vytažena jako souvislý blok $sql = ' SELECT c1.nazov AS cat1, c2.nazov AS cat2, c3.nazov AS cat3, t.* FROM TABLE_PREFIX c1 JOIN TABLE_PREFIX c2 ON c1.nadradena_skupina = c2.tovarova_skupina_id JOIN TABLE_PREFIX c3 ON c2.nadradena_skupina = c3.tovarova_skupina_id JOIN TABLE_PREFIX t ON c3.nadradena_skupina = t.tovarova_skupina_id WHERE c1.nadradena_skupina = 0 ORDER BY cat1, cat2, cat3, t.nazov'; $result = mysql_query($sql); # vytvoří nový XML dokument $doc = new DOMDocument(); # vytvoří nový element eshop $eshop = $doc->createElement('eshop'); # vloží element do dokumentu $doc->appendChild($eshop); # toto bude odkazovat napřed na skupinu z předchozího cyklu # a následně na aktuální skupinu $cat1Name = ''; # to samé pro příslušný element v XML $cat1Elem = null; $cat2Name = ''; $cat2Elem = null; $cat3Name = ''; $cat3Elem = null; # pro každý tovar: while($row = mysql_fetch_assoc($result)) { # level určuje, kolik úrovní musíme vytvořit pro tento item: # pokud je první v kategorii druhé úrovně, tak level = 2 # ještě jeme tuto kategorii první úrovně neviděli if ($row['cat1'] != $cat1Name) { $level = 1; } else if ($row['cat2'] != $cat2Name) { # to samé pro druhou $level = 2; } else if ($row['cat3'] != $cat3Name) { # to samé pro třetí $level = 3; } else { # jedná se o tovar $level = 99; } # všimni si, že nikde není break - je to elegantní způsob jak vyjádřit, # že se kus kódu má vykonávat jen za podmínky, že level < N switch ($level) { case 1: # musíme vytvořit první úroveň $cat1Name = $row['cat1']; $cat1Elem = $doc->createElement('navigation'); $cat1Elem->setAttribute('Description', $cat1Name); $eshop->appendChild($cat1Elem); # fall through case 2: # musíme vytvořit druhou úroveň $cat2Name = $row['cat2']; $cat2Elem = $doc->createElement('navigation'); $cat2Elem->setAttribute('Description', $cat2Name); $cat1Elem->appendChild($cat2Elem); # fall through case 3: # musíme vytvořit třetí úroveň $cat3Name = $row['cat3']; $cat3Elem = $doc->createElement('navigation'); $cat3Elem->setAttribute('Description', $cat3Name); $cat3Elem->appendChild($prevCat3Elem); # fall through default: # musíme vytvořit item $item = $doc->createElement('item'); $item->setAttribute('Description', $row['popis']); $item->setAttribute('Price', $row['cena_1']); $item->setAttribute('ImgUrl', $row['tovar_id']); $item->setAttribute('Url', $row['tovarova_skupina_id']); $item->setAttribute('Unit', $row['merna_jednotka']); $item->setAttribute('Code', $row['identif_kod']); $item->setAttribute('Name', $row['nazov']); $cat3Elem->appendChild($item); } } # na závěr stačí uložit xml do souboru file_put_contents('eshop.xml', $doc->saveXML()); # nebo rovnou, pomocí metody XMLDocumentu # $doc->save('eshop.xml'); Při použití funkce file_put_contents jsou povinné jen první dva parametry; ostatní jsou nepovinné (naznačeno hranatými závorkami v dokumentaci). |
||
jefitto44 Profil |
#6 · Zasláno: 25. 4. 2014, 13:23:14
Jj už ide všetko ako má, ďakujem
|
||
Kubo2 Profil |
#7 · Zasláno: 25. 4. 2014, 13:49:40
jefitto44:
„Jj už ide všetko ako má“ To som rád. Navrhnem však ešte alternatívne riešenie, v ktorom by si v podstate naplno využil pôvodný kód plus teda funkciu file_put_contents() :
<?php // volanie tejto funkcie úplne na začiatok súboru // pred pôvodný kód ob_start(); // zapne bufferovanie (zdržovanie) výstupu // pôvodný kód na generovanie a vypisovanie XMLka // (cez echo()) // ... // úplne na konci za pôvodným kódom file_put_contents ( "meno-súboru", // meno / cesta k súboru, do ktorého chceš XML zapísať ob_get_clean() // získanie vypísaného a zadržaného obsahu z bufferu+jeho vyčistenie ); Týmto dosiahneš, že na štandardnom výstupe nebude nič, ale všetok vygenerovaný obsah echo() m sa ti dostane do súboru špecifkovaného reťazcom "meno-súboru" . Takže iba toľko k tomu alternatívnemu riešeniu.
|
||
Časová prodleva: 10 let
|
0