PHP - 9. díl – práce se soubory a počítadlo stránek

Diskuze čtenářů k článku

nelida  |  08. 04. 2004 08:32  | 

jestli jsem to dobre pochopil, tak v prikladu 8 (pocitadlo) funkce fwrite() zapisuje v rezimu OVER (prepis), soudim tak podle toho, ze tam nevydim zadnej prikaz, kterej by smazal nactenou hodnotu

lze nejak nastavit rezim INS (vkladani)?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Miloslav Ponkrác  |  08. 04. 2004 10:52  | 

Soubory nikdy nedokážou pracovat v režimu vkládání. Vždy přepisují znaky na pozici, kam se zapisuje (případně pokud je pozice na konci, tak se přidává na konec). Proto i funkce fwrite vždycky pracuje jako OVER. Jako INS soubory nikdy nefungují.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Johny52  |  08. 04. 2004 11:50  | 

Používám program Intranetový server a při čtení z MySQL databáze se do internetovýho prohlíže místo českých zobrazí nesmysly...při prohlížení databáze v MySQL příkazovým řádku je všechno OK.
Poraďte co s tím?????

Souhlasím  |  Nesouhlasím  |  Odpovědět
hugo  |  08. 04. 2004 13:19  | 

Nemáš jenom blbe nastaveni kodovani v meta??

Souhlasím  |  Nesouhlasím  |  Odpovědět
Johny52  |  08. 04. 2004 14:16  | 

Hele jsem PHP-začátečník takže nevim přesně co myslíš...v HTML mam normálně:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

Souhlasím  |  Nesouhlasím  |  Odpovědět
Miloslav Ponkrác  |  08. 04. 2004 14:37  | 

Napsal jsem Vám přímo na Váš mail s žádostí o podrobnější popis. Rád Vám pomohu s potížemi.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Honza Baranyk  |  08. 04. 2004 22:52  | 

$načteno = fread($handle, 4);

staci neudelat takovou blbost jako dat si do nazvu promenny ceskej znak a pojede to v pohode...

Souhlasím  |  Nesouhlasím  |  Odpovědět
johny52  |  09. 04. 2004 09:51  | 

Nic takovýho nedělam. Neznam rozumnej důvod pro psaní českých názvů proměnných...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ritchie  |  08. 04. 2004 13:25  | 

Co se stane, pokud na stránku přistupuje více klientů současně? Dojde ke kolizi! Jeden přečte hodnotu počtu přístupů -- označme ji x -- ale již nestačí zapsat novou hodnotu x+1. Mezitím druhý přečte tu samou hodnotu počtu přístupů x. První zapíše x+1, druhý to přepíše na x+1. Výsledek je x+1, i když by měl být x+2, protože na stránku přistupovali dva klienti.

Tohle se v seriálu mělo objevit -- jak řešit současný přístup k souboru. Čtení souborů je bez problémů, ale současným konkurenčním zápisem do souborů si programátor koleduje o spoustu problémů. Řeší se to pomocí zámků (vytvoření / kontrola / zrušení zámku je atomická operace).

Souhlasím  |  Nesouhlasím  |  Odpovědět
saaasd  |  08. 04. 2004 13:46  | 

a jak to udelat? nejaky priklad?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Miloslav Ponkrác  |  08. 04. 2004 14:43  | 

Máte pravdu. Zahřešil jsem na to, že pravděpodobnost kolize je velmi nepatrná, a samotný díl už dost převyšoval obvyklou délku článku na Živě. Každopádně správné je řešit atomicky.

Souhlasím  |  Nesouhlasím  |  Odpovědět
pavel  |  08. 04. 2004 16:17  | 

To je skoro nemozna pravdepodobnost. To by museli otevrit ten soubor ve stejnou milisekundu, a ani pak si nejsem jistej, jestli by to php/os nezmanagoval.

Soubor nemuzes vicekrat otevrit pro zapis. Maximalne jednou. Problem nastava, pokud se v souboru vyskytujou dulezity data, ktery se ctou, muze nastat problem, ale vyresit se da jendoduse, bud pomoci zamku, nebo pomoci zjisteni stavu souboru (coz je praakticky to samy, ale rychlejsi na prvni prgani:) ). Ale proc uchovavat dulezity data v souboru, ze :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ritchie  |  08. 04. 2004 19:17  | 

V tomto konkrétním případě není pravděpodobnost kolize velká a když k ní dojde, mnoho škody to nezpůsobí. Jenže jsou i jiné případy, kdy takové opomenutí může mít katastrofické následky. Proto je vhodné programátory již od počátku vychovávat tak, aby podobná opomenutí nedělali.

Nějak nechápu, co myslíte tím "zmanagovat". Když otevřu soubor pro zápis několikrát současně, bude pro zápis několikrát současně otevřený a já do něj můžu současně zapisovat. Výsledek je ale potom těžko definovatelný.

Souhlasím  |  Nesouhlasím  |  Odpovědět
pavel  |  03. 08. 2004 14:13  | 

Hehe ted jsem se nahodou dostal k tehle diskuzi, tak zkusim pripojit jeste komentar... :) Asi si to uz nikdo neprecte ale co :)


Soubor ani ve woknech ani na linuxu nejde otevrit dvakrat ve stejnou dobu pro zapis. System ti to neumozni a jeste vyhodi chybu.


Nesmis ale brat v uvahu napr. WinCMD, notepad a dalsi, ty pracuji se souborem jenom pri otevreni a pri zapisu. Jinak nechavaji soubor zavrenej a prekopirujou ho do tempu. Napr. jadro oken tohle nedela. Proto neni mozny user.dat z aktualniho profilu (WNT, W2k, WXP) otevrit ani pro cteni.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ritchie  |  09. 08. 2004 02:20  | 

Prosím vás, kde jste na to přišel?!?! Mohu hovořit jen za Linux, protože Windows nepoužívám, a v Linuxu to nakrásně jde. Jakou chybu podle vás systém vyhodí?

Souhlasím  |  Nesouhlasím  |  Odpovědět
FunThom@$  |  01. 11. 2004 14:50  | 

Tak ta nemozna pravdepodobnost mi pravidelne 1 za mesic vynuluje pocitadlo...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Honza007  |  17. 01. 2007 10:49  | 

A není to proto, že tam dojde k přetečení zásobníku při matematické operaci?

Souhlasím  |  Nesouhlasím  |  Odpovědět
paaf  |  08. 04. 2004 13:44  | 

V článku už jen chybí funkce na smazání souboru, pokud možno nějaká spolehlivá,

díky, paaf

Souhlasím  |  Nesouhlasím  |  Odpovědět
Miloslav Ponkrác  |  08. 04. 2004 14:50  | 

Funkce
unlink ( jméno_souboru )

Souhlasím  |  Nesouhlasím  |  Odpovědět
Paja  |  23. 04. 2004 17:47  | 

Tam chybi treba i prace s adresari - to php umi taky!

Souhlasím  |  Nesouhlasím  |  Odpovědět
Peta Chudak  |  22. 05. 2004 11:40  | 

<?php
  $handle = fopen("a.txt", "a");
  if ($handle)
    echo "Otevření souboru se povedlo.";
  else
    die("Otevření souboru selhalo.");

  fwrite($handle, "Haló", 2);

  fclose($handle);
?>


dost me zarazilo, ze nemuzu pouzit


$pozdrav="halo"


fwrite($handle, $pozdrav,2)'


ze to funkce fwrite jde pouze primo hodnota nikoliv promenna a dale by me zajimalo jak mam v souboru radkovat


"halo<br>" nefunguje diky...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Miloslav Ponkrác  |  22. 05. 2004 18:36  | 

Toto použít samozřejmě můžete:

$pozdrav="halo"
fwrite($handle, $pozdrav,2);

Odřádkování je možné použitím speciálního znaku \n

"halo\n" bude fungovat,
pro DOSovské editory bude fungovat "halo\r\n"





Souhlasím  |  Nesouhlasím  |  Odpovědět
Vasek Adamec  |  10. 06. 2004 08:56  | 

Jde nejak nastavit pozici kurzoru v souboru?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Vasek Adamec  |  10. 06. 2004 08:59  | 

jsem hloupej a slepej - uz to mam Fseek

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jiper  |  04. 05. 2005 11:19  | 

Mám dotaz.
Stejně tak jako u fread můžeme zadat, kolik znaků chceme číst či u ukazovátka kolik máme znaků...můžeme u fwrite zadat, za kolikátý znak se daný text zapíše?

Souhlasím  |  Nesouhlasím  |  Odpovědět
xtreme  |  16. 06. 2006 20:47  | 

mam takyto dotaz:
existuje v PHP nieco take, ako READLN a WRITELN v Pascale? teda po kazdom nacitani/zapise sa prejde na novy riadok v subore?
za odpoved vopred dakujem...

Souhlasím  |  Nesouhlasím  |  Odpovědět
maxxik  |  20. 09. 2007 10:32  | 

$lines = file('YourFile.txt');
foreach ($lines as $line_num => $line)
{
print "{".$line_num."} : " . $line . " \n";
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr  |  24. 09. 2006 20:07  | 

Mám prosbu - proč nefunguje tento script (dole), který načítá z formuláře (nahoře)? (Ne)Ukládá data do textového souboru. Když je zapíšu do textového souboru přímo, include je načte, to funguje. Globální proměnné jsou OFF.

Děkuji

Petr

SCRIPT:




Jméno
 style ="border: 1px solid">


Příjmení
 style ="border: 1px solid">


Obec
 style ="border: 1px solid">



  



 style ="border: 1px solid">








$file = "bezci.txt"; //jméno souboru, do kterého budete zapisovat adresy

$jmeno = $_POST["jmeno"];
$prijmeni = $_POST["prijmeni"];
$adresa = $_POST["adresa"];

if (isset($_GET["jmeno"]) && isset($_GET["prijmeni"]) && isset($_GET["adresa"]))

{
$fp = fopen("$file", "a") or die("Nelze otevřít soubor $file.");
fwrite($fp, "$jmeno $prijmeni - $adresa
");
fclose($fp);
}

include("$file");

?>

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor

Aktuální číslo časopisu Computer

Test 9 bezdrátových reproduktorů

Jak ovládnout Instagram

Test levných 27" herních monitorů

Jak se zbavit nepotřebných věcí na internetu