IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Výstup funkce do souboru přes fwrite

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
gorri
Člen
Avatar
gorri:1.11.2019 17:04

Ahoj,
určitě už každý z vás zapisoval do souboru nová data formou fopen, fwrite, fclose.
Zkoušel někdo do souboru tímto způsobem zapsat výstup z funkce?
Jde mi o to, že jsem si chtěl do souboru generovat data z funkce, ale z nějakého mě nepochopitelného důvodu je nechce zapsat. Generování jsem dal dokonce pryč a napsal jsem do funkce jen slovo test a stejně se nic neuložilo.
Poradil by prosím někdo?
$c1, $c2, $c3 se mi bez problémů zapíše. $t ne
Níže je kód

$c1 = 'Text 1';
    $c2 = 'Text 2';
    $c3 = 'Text 3';

function funkcesdaty() {
echo 'Test';
}
$t = funkcesdaty();

$file = fopen("./adresaksouboru/soubor.php","w");
fwrite($file,$c1. PHP_EOL .$c2. PHP_EOL . $t. PHP_EOL . $c3);
fclose($file);

Děkuji za případné rady :-)

Zkusil jsem: ITnetwork, php.net, google

Chci docílit: Zápis dat z funkce do souboru

Odpovědět
1.11.2019 17:04
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:2.11.2019 9:05

Tak jsem si myslel, že jsem to vyřešil a ono opět prd. Zkusil jsem přidat proměnou k výpisu a přidat return $promenasvypisem a fungovalo to. Bohužel jen pro jeden řádek. A má to vypsat více řádků. Konkrétně jde o položky v menu. A těch je více.
Věděl by někdo v čem dělám chybu? Děkuji za případné rady.

Nahoru Odpovědět
2.11.2019 9:05
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michael Škrášek:2.11.2019 10:31

Pokud chceš přesměrovat výpis echo ... můžeš použít output buffering, ale myslím si, že bude lepší, když bude funkce prostě vracet všechny položky menu ...

př.

function menu()
{
        polozky = ["prvni radek menu", "druhy", "treti"];
        return implode("\n", polozky)
}

...
fwrite($file, menu());
Nahoru Odpovědět
2.11.2019 10:31
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar

Člen
Avatar
Odpovídá na gorri
:2.11.2019 11:12

Máš v tej funkcii chybu. Ak sa má výsledok funkcie dať uložiť do premennej, musí výsledok vracať, nie echovať. Prepíš echo na return a pôjde to:

function funkcesdaty() {
  return 'Test';
}
Editováno 2.11.2019 11:13
 
Nahoru Odpovědět
2.11.2019 11:12
Avatar
gorri
Člen
Avatar
gorri:2.11.2019 11:21

Děkuji za reakce.
Udělal jsem pár úprav a stejně se stále vypisuje jen jedna položka.
Tady je celý script
Jestli tam někdo najde chybu, budu moc rád. Já už fakt nevím. Několikrát jsem to přepisoval.
Toto má vygenerovat sitemap

$c1 = '<?xml version="1.0" encoding="UTF-8"?>';
    $c2 = '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
            xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    function mapa() {
        foreach(Db::queryAll('SELECT * FROM menu WHERE aktivni=? AND username=?', 1, Db::querySingle('SELECT username FROM web WHERE url=?', $_GET['name'])) as $m)
        {
            $sm = Db::queryOne('SELECT * FROM menu WHERE aktivni=? AND username=? AND url=? AND link=? AND centralni=?', 1, $m['username'], $_GET['name'], '/', 0);
                    if($sm['link'] == '/')
                    {
                        $l = '';
                    }
                    else
                    {
                        $l = '/';
                    }
            if($m['link'] == '/')
                {
                    $cs0 = '<url>';
                    $cs1 = '<loc>http://'.$sm['url'].$l.Db::querySingle('SELECT link FROM menu WHERE aktivni=? AND url=? AND username=?', 1, $_GET['name'], $m['username']).'</loc>';
                    $cs2 = '<lastmod>'.date("Y-m-d").'</lastmod>';
                    $cs3 = '<changefreq>weekly</changefreq>';
                    $cs4 = '<priority>1</priority>';
                    $cs5 = '</url>';
                }
                if($m['link'] !== '/')
                {
                    $cs0 = '<url>';
                    $cs1 = '<loc>http://'.$sm['url'].'/'.Db::querySingle('SELECT link FROM menu WHERE aktivni=? AND url=? AND username=?', 1, $_GET['name'], $m['username']).'</loc>';
                    $cs2 = '<lastmod>'.date("Y-m-d").'</lastmod>';
                    $cs3 = '<changefreq>weekly</changefreq>';
                    $cs4 = '<priority>1</priority>';
                    $cs5 = '</url>';
                }
        return PHP_EOL.$cs0.PHP_EOL.$cs1.PHP_EOL.$cs2.PHP_EOL.$cs3.PHP_EOL.$cs4.PHP_EOL.$cs5.PHP_EOL.PHP_EOL;
        }


    }

    $c3 = '</urlset>';
    echo

Tady je zápis do souboru

$file = fopen("./webs/sitemap.xml","w");
fwrite($file,$c1. PHP_EOL .$c2. PHP_EOL . mapa() . PHP_EOL . $c3);
fclose($file);

Moc děkuji za zpětnou vazbu

Nahoru Odpovědět
2.11.2019 11:21
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Odpovídá na gorri
Michael Škrášek:2.11.2019 11:57

returnuješ hodnotu při prvním projití foreach cyklem ...

function mapa() {
    $output = ""
    foreach(Db::queryAll('SELECT * FROM menu WHERE aktivni=? AND username=?', 1, Db::querySingle('SELECT username FROM web WHERE url=?', $_GET['name'])) as $m)
    {
        $sm = Db::queryOne('SELECT * FROM menu WHERE aktivni=? AND username=? AND url=? AND link=? AND centralni=?', 1, $m['username'], $_GET['name'], '/', 0);
                if($sm['link'] == '/')
                {
                    $l = '';
                }
                else
                {
                    $l = '/';
                }
        if($m['link'] == '/')
            {
                $cs0 = '<url>';
                $cs1 = '<loc>http://'.$sm['url'].$l.Db::querySingle('SELECT link FROM menu WHERE aktivni=? AND url=? AND username=?', 1, $_GET['name'], $m['username']).'</loc>';
                $cs2 = '<lastmod>'.date("Y-m-d").'</lastmod>';
                $cs3 = '<changefreq>weekly</changefreq>';
                $cs4 = '<priority>1</priority>';
                $cs5 = '</url>';
            }
            if($m['link'] !== '/')
            {
                $cs0 = '<url>';
                $cs1 = '<loc>http://'.$sm['url'].'/'.Db::querySingle('SELECT link FROM menu WHERE aktivni=? AND url=? AND username=?', 1, $_GET['name'], $m['username']).'</loc>';
                $cs2 = '<lastmod>'.date("Y-m-d").'</lastmod>';
                $cs3 = '<changefreq>weekly</changefreq>';
                $cs4 = '<priority>1</priority>';
                $cs5 = '</url>';
            }
            $output .= PHP_EOL.$cs0.PHP_EOL.$cs1.PHP_EOL.$cs2.PHP_EOL.$cs3.PHP_EOL.$cs4.PHP_EOL.$cs5.PHP_EOL.PHP_EOL;
    }

    return $output;
}
Editováno 2.11.2019 11:58
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
2.11.2019 11:57
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
gorri
Člen
Avatar
Odpovídá na Michael Škrášek
gorri:2.11.2019 12:32

Takže return má být až na konci. Chápu. Děkuji. Toto by mělo fungovat jak se dívám a taky funguje. Moc děkuji :-)
Opět drobnost způsobí, že funkce je k ničemu :-D

Nahoru Odpovědět
2.11.2019 12:32
Když vím, tak poradím. Nikdo neví všechno :-)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.