Autor Zpráva
Lunsdail
Profil *
Zdravím,
potřeboval bych na jednom webu udělat jednoduchý výpis článku.
Ve zkratce:
Pokud zadám do prohlížeče web.cz/prvni-clanek.php , tak aby se na část stránky vypsal html soubor, který je uložený web.cz/clanky/prvni-clanek.txt(bude obsahovat i html znaky)
Takže aby přečetl zadanou url a poté podle ni vypsal clanek.

Jde mi o to, abych mohl udělat jednotné menu, hlavičku, patičku pro všechny články a pak to mohl jednoduše měnit.
Předem díky za rady
leorond
Profil
Takže vlastně chceš vypsat něco z .txt souboru

To chceš asi tohle ( CZ )
PHP - práce se soubory
Nebo třeba tohle ( EN )
fopen()

Já si osobně myslím že lepší bys měl načítat soubory .html

    <?php
    $myFile = 'test.html';
    
    if ($fp = fopen($myFile, 'r')) {
       $content = '';

       while ($line = fread($fp, 1024)) {
          $content .= $line;
          echo    $content;
       }
    
    } else {
        // ...
    }
    ?>



Výpis je stejný jako u .txt souborů takže stačí změnit název souboru, ale je to jen příklad doporučuji ho zabezpečit


Jinak ještě jedna informace k funkci fread()
// fread(soubor, pocet_znaku)
// Výpis prvních 1024 znaků
fread($fp, 1024)

// Výpis všech znaků ze souboru
fread($fp, filesize($myFile))
pcmanik
Profil
Lunsdail:
Namiesto fopen, fread... radšej použi pohodlnejšie a menej ukecané file_get_contents.

Nehladáš skôr include? S ním si môžeš vytvoriť samostatný súbor pre hlavičku, patičku, menu... a nebudeš tak musieť niečo meniť na viacerých miestach.

leorond:
Já si osobně myslím že lepší bys měl načítat soubory .html
V čom? Z pohľadu php je to úplne jedno, stále sa jedná o binárny súbor ktorý obsahuje textové dáta.

No ještě by to šlo přes file()
Kde spomínal Lunsdail že chce počítať riadky a vlastne aký význam má ten kus kódu ktorý si odniekial skopíroval?

Ten tvoj kód v [#2] je bez tak chybný... Schválne si ho vyskúšaj a či dostaneš výsledok, ktorý očakávaš.
leorond
Profil
No ještě by to šlo přes file()

například takto

$myFile = 'test.htm';

$content = file($myFile);

// how many lines in this file
$numLines = count($content);

// process each line
for ($i = 0; $i < $numLines; $i++) {
   // use trim to remove the carriage return and/or line feed character 
   // at the end of line 
   $line = trim($content[$i])

   // do something with $line here ...
}



pcmanik:
Načo to zbytočne komplikuješ a mätieš Lunsdail s kódom ktorý je ľachko náchylný k chybám a je zbytočne ukecaný?
Myslím že je dobré vědět že má víc než jen jednu možnost kterou mu nabízíš ty.

Ať si sám vybere která mu bude vyhovovat více.


Ten kód mi dává dobrý výsledek, zkoušel jsem ho než jsem ho sem dával
Davex
Profil
Lunsdail:
K vypsání obsahu souboru není potřeba nic složitého a stačí jednoduchá funkce readfile("./clanky/prvni-clanek.txt").
mckay
Profil
V případě, že se rozhodnete pro verzi využívající funkci fopen(), nezapomeňte soubor po použití také zavřít pomocí fclose(). Je to vhodné jak z bezpečnostních důvodů ([1], [2], [3]), tak také kvůli šetření prostředků serveru.
pcmanik
Profil
mckay:
Jedná sa o extrémne staré bezpečnostné chyby ktoré boli opravené a naviac som nenašiel zmienku že sa týkajú priamo PHP.
Šetrenie prostriedkov má význam len pri dlho trvajúcich skriptoch, inak príde automaticky k zrušeniu resource.
mckay
Profil
pcmanik:
Máte pravdu, co se týče věku linkovaných chyb. Chtěl jsem poukázat na fakt, že k chybám tohoto charakteru docházelo a určitě ještě bude docházet - principielně třeba potom i tak, že bude provedena drobná, na první pohled neškodná implementační změna, u které až časem někdo odhalí, že v určitých případech může způsobit problémy. Chyby se týkají nižších funkcí pro čtení souborů, které nakonec i PHP použije.

Váš argument o šetření prostředků je taktéž validní, avšak mám dojem, že zároveň i nedostatečně edukativní - nabádá k lenosti/špatným praktikám. Čistě teoreticky, kdyby PHP vyvolalo segfault v průběhu vykonávání krátkého skriptu, který si po sobě nezavírá stream, mohlo by to něčemu vadit?

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: