Autor Zpráva
dzarda94
Profil
Už sem si tu něco o tom přečetl, že se na to používá /r/n apod. ale pořád netuším jak a kde to použiju. Mam formulář s textovym polem a chci aby se při každym odeslání ten text zalomil v tom txt souboru. Mam takovýto script:
<?php
 $nazev = $_REQUEST["nazev"]
 $otevrit = fopen("nazev.txt","a");
 fwrite ($otevrit,$nazev);
 fclose ($otevrit);
?>
Kam napíšu to /r/n nebo <br />?
Medvídek
Profil
dzarda94:
Doporučuji používat PHP_EOL (a nemusíš rozlišovat jestli běžíš na WIN, nebo LINUXU). A vložíž ho za ten název, co ukládáš do txt.
Tori
Profil
Aby po každém odeslání formuláře začínal text na novém řádku? fwrite ($soubor, "\n" . $text); Musí to být v uvozovkách, ne v apostrofech. \n (LF) je odřádkování používané v linuxu a podobných OS, windows používá sekvenci \r\n (CR + LF). viz wikipedie

Jinak řádky 3-5 se dají napsat i takto: file_put_contents($jmenoSouboru, $text, FILE_APPEND);Když tam je ta zvýrazněná konstanta (FILE_APPEND), tak se nový text připojí na konec souboru. Bez ní - jen se dvěma parametry - se přepíše obsah souboru novým textem.

edit: ↑[#2] to je lepší způsob než co jsem napsala
dzarda94
Profil
Paráda, oba způsoby fungují, děkuji mockrát za pomoc :)
smiesek
Profil
Procházím různé návody a rady, jak každý nový údaj do souboru txt dostat na nový řádek, ale pořád se mi to vkládá za sebou, mám následující:
zkoušela jsem jak variantu jednu
        $file = fopen("maillist.txt","a"); // soubor bude otevřený pro zápis dat
        fwrite($file, $email); // zápis textu do souboru
        fwrite($file,"\n"); // vytvoření nového řádku
        fclose($file); // zavření souboru

tak druhou
        $file = fopen("maillist.txt","a"); // soubor bude otevřený pro zápis dat
        fwrite($file, "\n $email"); // zápis textu do souboru
        fclose($file); // zavření souboru

v čem je prosím chyba?
Po otevření souboru txt mám text stále na jednou řádku.
Místo \n jsem zkoušela i použít <br /> výsledek stejný s tím, že se mi <br /> vložilo přímo do souboru txt
juriad
Profil
smiesek:
Že ty to zkoušíš na Windows a na soubor se díváš v Notepadu (poznámkovém bloku)?
Ono tam to zalomení řádku je, ale není vidět.
Mimochodem, ta druhá ukázka bude na každé nové řádce před e-mailem obsahovat mezeru.
Jaký editor používáš pro psaní v HTML, PHP?

Každý operační systém totiž zalamuje řádky jinak:
- Windows používá sekvenci "\r\n"
- Linux používá "\n"
- OSX používá "\r" To už není pravda; OS X používá také \n; \r používaly staré Macky

Kdybys to otevřela v nějakém schopnějším editoru, tak se ti ty řádku ukáží (editor umí detekovat formát). Pro náhled stačí třeba WordPad (doufám, že se tak jmenuje).
Jelikož většina PHP serverů běží na Linuxu, píší se obvykle skripty předpokládající Linuxové konce řádků (\n).

Pokud chceš, aby ti skripty ukládaly konce řádků podle lokálních pravidel (a nebudeš-li příliš chtít přenášet data mezi různými operačními systémy), můžeš použít konstantu PHP_EOL, jejíž hodnota je jeden z výše uvedených konců řádků podle toho, kde zrovna PHP běží.

        $file = fopen("maillist.txt","a"); // soubor bude otevřený pro zápis dat
        fwrite($file, $email); // zápis textu do souboru
        fwrite($file, PHP_EOL); // vytvoření nového řádku
        fclose($file); // zavření souboru
smiesek
Profil
juriad:
ah moje chyba, přesně tak jak píšete, to zkouším na Windows s poznámkovým blokem, děkuju za upozornění, nyní tedy funguje již jak má.

Editor používám Notepad++, ale právě tady u toho txt souboru jsem pro rychlost ověření funkčnosti jej otevírala pomocí poznámkového bloku, proto se mi tedy text řadil hned za sebe. Nyní jsem to otevřela v NP++ a už záznamy vidím každý na jednotlivém řádku.
Taky jsem použila Vaše doporučení PHP_EOL.

Vím, že všechny funkce od fopen,fwrite,fclose se dají nahradit file_put_content s následujícími parametry
file_put_content("mailist.txt", $email . PHP_EOL, FILE_APPEND);
v tomto případě je prosím vložení PHP_EOL přípustné?
juriad
Profil
file_put_content ve skutečnosti používá fopen, fwrite and fclose. Mimochodem, máš tam překlep: FILE_APPEND.

Použití té konstanty je vhodné, když chceš aby se to na Linuxovém serveru chovalo linuxácky a na Windowsech windowsácky. Třeba proto, že výstupní soubory budeš na tom samém počítači zpracovávat ještě jiným programem.
Naopak nevhodné je v případě, že aplikace běží na Linuxu, ale ty si na Windowsovém počítači treba exportuješ do texťáku seznam produktů, které následně budeš přenášet na server. Většině nástrojů je jedno, jaké konce řádků jsou použité, až na bambilion výjimek.
Nezávisí to na funkci, kterou použiješ. (Existuje však výjimka - funkce pracující se sítí - v HTTP a dalších protokolech musí být řádky oddělené "\r\n", ale ty funkce to občas zařídí sami. Není úplně zřejmé, jaké konce řádků máš předat takové funkci mail).

Další věc, která s konci řádů souvisí, je, že by soubor měl končit novým řádkem; je to z důvodů Unixových nástrojů, které na to spoléhají.
smiesek
Profil
juriad:
jde mi o vkládání jednotlivých záznamů na nový řádek, abych následně mohla toho využít pro kontrolu, zdali se již takový záznam v txt souboru objevuje.
Proto ještě nemohu přijít na to, jakým způsobem při použití file_put_content vkládat nový řádek.
juriad
Profil
smiesek:
Je to jedno; každá možnost je správně. Jen se liší tím, co očekáváš na výstupu:
1) \n
+ Je to nejjednodušší na zapamatování a používání.
+ Všude to bude stejně.
- Windowsové editory s tím mohou mít potíže.
2) PHP_EOL
+ Bude to vždy podle zvyklostí operačního systému.
- Chování závisí na operačním systému.
- Je to dlouhé (7 znaků + nelze vnořit do řetězce).
3) \r\n
+ Bude to vždy fungovat na Windows.
- V Linuxu se to často ukazuje jako ^M.
- Je si třeba dávat pozor na nezapomenutí \r.

Osobně (jelikož používám Linux) mám všude \n. Lidi už si zvykli, že soubory ode mě nemůžou otevírat v Notepadu.
Možná ještě počkej nebo založ nové vlákno přímo s otázkou, jaké konce řádků používat při vývoji na Windows.
Jan Tvrdík
Profil
juriad:
Windowsové editory s tím mohou mít potíže.
Já bych to zkonkrétnil na „poznámkový blok“ s tím bude mít potíže. Neznám žádný jiný editor, který by to nezvládal.
juriad
Profil
Jan Tvrdík:
Také znám jen ten Notepad, ale myslel jsem, že neuškodí generalizovat. S vysokou pravděpodobností nebude jediný. A nevím třeba, jak se bude chovat příkazová řádka po zadání příkazu type.

A když už jsi tu, co bys poradil smiesce (doufám, že to skloňuji správně)? Samotného by mě to zajímalo.
Jan Tvrdík
Profil
juriad:
co bys poradil smiesce
Používat libovolný editor vhodný k programování a \n jako konce řádků.
smiesek
Profil
sleduji tuto diskusi a když jsem to tedy změnila z PHP_EOL na \n, tak se mi to v Notepadu zase už nezapisuje na řádky :(
        $file = fopen("maillist.txt","a"); // pokud ano, soubor bude otevřený pro zápis dat
        fwrite($file, $email); // zápis textu do souboru
        fwrite("\n"); // vytvoření nového řádku
        fclose($file); // zavření souboru

stejně tak jako ani výpis souboru dat do stránky se to nevypíše na řádky
echo "<strong>Výpis obsahu souboru zapsaných adres</strong><br />";
$maillist = fopen("maillist.txt","r");
fpassthru($maillist);
fclose($maillist);

edit: moje chyba v použití fwrite($file, "\n");
juriad
Profil
smiesek:
První problém má řešení nepoužívat Notepad.

Druhý je ve skutečnosti tvoje chyba. HTML totiž jakoukoli sekvenci bílých znaků považuje za jednu mezeru.
Potřebuješ tedy každé odřádkování nahradit za <br>.
$maillist = file_get_contents("maillist.txt");
echo nl2br($maillist, false);
smiesek
Profil
juriad:
aha, děkuju, Vaše řešení nyní již funguje

Zkoušela jsem jej aplikovat na ten můj delší zápis, ale nedaří se, někde dělám chybu
$maillist = fopen("maillist.txt","r");
fpassthru($maillist);
echo nl2br($maillist, false);
fclose($maillist);
juriad
Profil
smiesek:
$maillist není text; zavolej
var_dump($maillist);
a uvidíš. Je to zástupce souboru (často se říká file handle), který se předává všem nízkoúrovňovým souborovým funkcím. Sám o sobě není užitečný.
smiesek
Profil
juriad:
dobře, děkuju, nebudu se to tam tedy snažit pasovat

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: