Autor Zpráva
jefitto44
Profil
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
Ukaž kód, kterým to xml vytváříš.
Funkce na ukládání do souboru je file_put_contents.
jefitto44
Profil
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 ]] )
toto umiestním pod celý ten skript. $filename priradením stringu určím názov súboru (otázka- aj s príponou, alebo bez?) Pod mixed $data musí ísť toto, čo som vyššie napísal, teda $data= celé toto, čo vypisuje xml???
$flags, to som nepochopil, asi nechám 0. resource $context taktiež neviem na čo je dobré.
Ďakujem
jefitto44
Profil
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
Jj už ide všetko ako má, ďakujem
Kubo2
Profil
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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