php subor - vykonať funkciu len raz

Programovacie jazyky, rady, poradňa...
Old Dirty Bastard
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2658
Registrovaný: 13 júl 2006, 8:05
Bydlisko: phpbb_posts

php subor - vykonať funkciu len raz

Príspevok od používateľa Old Dirty Bastard »

zdravim, mam subor index.php a po jeho zobrazeni sa vykona ista funkcia.. ja chcem zamedziť, aby sa pri stlačeni tlačitka refresh nevykonala znova.. teda aby po načitani suboru bolo vykonanie funkcie len jednorazove a pri dalšom refreshovani stranky by sa nič nedialo.. jedine ak by uživatels tranku uzavrel a otvoril nanovo.. vtedy by sa funkcia zase jednorazovo vykonala..

obsah suboru je tuto:

Kód: Vybrať všetko

<?php

// definuje nazov suboru alebo celu adresu k nemu 
define ("ID"); 

/** 
 *  funkcia zisti ci existuje subor otvori ho nacita vnom cislo 
 *  zvacsi ho o +1 a vrati hodnotu o +1 nez bola posledna 
 */ 
  
function prirataj () { 
if (file_exists(ID)) 
{ 
  $subor=fopen(ID, "r+"); 
  $odoslane=fread($subor, 10); 
} 
else 
{ 
  $subor=fopen(ID, "w"); 
  $odoslane='0';    
} 
rewind($subor); 

fwrite($subor,++$odoslane,10); 
fclose($subor); 
  
return $odoslane; 
} 
/** 
 *  takto si tu funkciu zavolas,daj si to do podmienky kde overujes ci bol formular odoslany 
 *  ak ano tak sa vykona tato funkcia a ono ti to vrati "jedinecne" cislo a dalej v kode uz 
 *  pracujes len s tou premennou $i alebo aku si zvolis 
 */ 
$i = prirataj();  
echo $i;
?>
mate nejaku predstavu ako by sa dalo zariadiť to "jednorazove" vykonavanie funkcie? po prvom načitani na stranke vznikne čislo.. ale ja chcem, aby ak uživatel stlači refresh neprebehlo vykonanie funkcie a teda čislo by sa dalej nezmenilo o +1... len ak by uživatel stranku uzavrel a načital ju trebars odkliknutim adresy v bare druhykrat, ale zase po refreshi by sa s čislom nič nedialo..
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Príspevok od používateľa Snacker »

Mozno by ti trosku pomohlo ak by si si dal textak, kde by sa zaznamenala posledna IP navstevnika. A funkcia by vyzerala tak ,ze najprv by sa vytiahol tu IP z textaku bola by tam podmienka napr.

Kód: Vybrať všetko

if (!($IP_z_txt == $_SERVER['REMOTE_ADDR'] ))
{

// ak sa IP z textaku nerovna sucasnej IP navstevnika 
// zapiseme novu IP do textaku
// precitame, pripocitame +1 a zapiseme do napr. pocitadlo.txt
}
Nevyriesi to vsetky problemy, uz pri sucasnej navsetve 2ludi by to skreslovalo ale mozno pri mensej navsetvosti by to trosku brzdilo zapis.

Napr. premakat si to mozes s pouzitim databazy ale ta je trosku pomlsia ako txt subor :D ... s textakmi nerobim, to je jedine co ma take napadlo, ale mozno sa tu najde profi co splni vseky tvoje poziadavky. Alebo chod na http://www.pocitadlo.sk :lol:
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

Databaza s tabulkou a stlpcami cislo, ip, den (alebo ine casove obdobie) a stlpec cislo bude primarny kluc (autoinkrement)... ak uz v tabulke ip a den je vrati existujuce cislo, ak nie vytvori nove a to vrati... moj navrh
TGiJack
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 30 nov 2006, 19:37
Bydlisko: NO
Kontaktovať používateľa:

Príspevok od používateľa TGiJack »

ved už som ti tušim to raz posielam :) si sa nato pital v inej teme alebo cez SS
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

Príspevok od používateľa ppt »

Snacker napísal: Napr. premakat si to mozes s pouzitim databazy ale ta je trosku pomlsia ako txt subor :D
Tak tuto vetu by som chcel vysvetlit. :wink:

k teme:
To co pisali nadomnou, tak neriesi tvoj problem. Nakolko by to priratavalo jednotku z jednej IPcky za jeden den. Ak by navstevnik zavrel prehliadac a otvoril ho nanovo (vytvoril novu session), tak by to uz nepricitalo cislo, nakolko v db by uz zaznam bol. Rovnako aj keby niekto iny, kto ma taku istu externu IPcku ako ty, otvoril stranku, opat by nepricitalo hodnotu k pocitadlu.
Vyriesit to mozes napr pouzitim session premennej. Pri nacitani stranky porovnas, ci je session premenna nastavena. Ak nie je, tak sa zvysi pocitadlo a nastavi sa session premenna.
TGiJack
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 30 nov 2006, 19:37
Bydlisko: NO
Kontaktovať používateľa:

Príspevok od používateľa TGiJack »

neviem či nečitaš SS ale už si to raz žiadal

Kód: Vybrať všetko

Od:	TGiJack
Komu:	Old Dirty Bastard
Zaslal:	02 Jún 2009, 13:05
Predmet:	Re: (html/php) formular s jedinečnym ID čislom (bez použitia DB)	
<? 
// toto si daj na zaciatok PHP suboru 
session_start(); 
// definuje nazov suboru alebo celu adresu k nemu 
define ("NAZOV_SUBORU", "posledne_cislo.txt"); 

/** 
* funkcia zisti si existuje subor otvori ho nacita vnom cislo 
* zvacsi ho o +1 a vrati hodnotu o +1 ney bola posledna 
*/ 

function prirataj () { 
if (!isset($_SESSION[priratane])) { 
if (file_exists(NAZOV_SUBORU)) 
{ 
$subor=fopen(NAZOV_SUBORU, "r+"); 
$stav=fread($subor, 10); 
} 
else 
{ 
$subor=fopen(NAZOV_SUBORU, "w"); 
$stav='0'; 
} 
rewind($subor); 

fwrite($subor,++$stav,10); 
fclose($subor); 
$_SESSION[priratane] = true; 
return $stav; 
}else { 
$subor=fopen(NAZOV_SUBORU, "r+"); 
$stav=fread($subor, 10); 
fclose($subor); 
return $stav; 
} 
} 
/** 
* takto si tu funkciu zavolas,daj si to do podmienky kde overujes ci bol formular odoslany 
* ak ano tak sa vykona tato funkcia a ono ti to vrati "jedinecne" cislo a dalej v kode uz 
* pracujes len s tou premennou $i alebo aku si zvolis 
*/ 
$i = prirataj(); 

/** 
* ked sa ti cely ten tvoj formular vykona a chces aby mohol uzivatel znova opakovat a abz sa ti znova priratalo 
* cislo staci ak na koniec celeeho tvojho suboru das len nasledujuci riadok,cele bz to asi vyzeralo takto: 
* 
* session_start(); 
* nejaka ta tvoja podmienka ci bol formular odoslany, ak hej pokracuje dalej 
* $i = prirataj(); 
* . 
* .Tvoj formular nejake tie operacie co potrebuje a podobne 
* . 
* nakoniec ked vsetko uz je OK zobrazilo sa uzivatelovi co si chcel pridas tento riadok 
* unset($_SESSION[priratane]); toto sposobi ze ti zmaze ten session a znova sa ti moze priratat 
* nove cislo,prilep si to najlepsie na posledne tlacitko tvojho formularu, 
* 
*/ 

unset($_SESSION[priratane]); 

echo "Formular bol poslany $i krat";
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Príspevok od používateľa Snacker »

ano session by to mohol vyriesit.
Tak tuto vetu by som chcel vysvetlit.
Co chces vysvetlit? Chces mi povedat ze zapis do txt suboru je rovnako rychli ako zapis do databazy, alebo ?
TGiJack
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 419
Registrovaný: 30 nov 2006, 19:37
Bydlisko: NO
Kontaktovať používateľa:

Príspevok od používateľa TGiJack »

Snacker napísal:ano session by to mohol vyriesit. Co chces vysvetlit? Chces mi povedat ze zapis do txt suboru je rovnako rychli ako zapis do databazy, alebo ?
skor by som sa pital čo je efektivnejšie :) ... pridklad dajne tomu že pride na stranku 20000 ludi naraz čo bude asi rýchlejšie a spolahlivejšie? :)
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Príspevok od používateľa Snacker »

Ak sa pytas co bude rychlejsie tak txt subor ak sa pytas co bude spolahlivejsie, tak nevidim dovod preco by by mala byt databaza spolahlivejsia pokial samozrejme porovnavas rovnake implementacie pri oboch rieseniach. Jedina preferencia databazy je moznost sofistikovanejsej implementacie.
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

Príspevok od používateľa ppt »

Keby si nenapisal tu poslednu vetu, tak ti napisem, ze ty by si aj toto forum spravil na taky styl, ze by sa data ukladali do suboru. :D
Snacker
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 362
Registrovaný: 08 jún 2009, 22:42
Kontaktovať používateľa:

Príspevok od používateľa Snacker »

Textove subory vobec nepouzivam v mojich projektoch. Na mini veci sa ti mozu hodit (ako je napr. toto pocitadlo)ale urcite na nich nepostavis forum. Ja taktiez preferujem databazu a preferujem hlavne integritu dat :lol: ale na mini minipocitadlo je aj textak dobry
Old Dirty Bastard
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2658
Registrovaný: 13 júl 2006, 8:05
Bydlisko: phpbb_posts

Príspevok od používateľa Old Dirty Bastard »

Snacker - nechcem to obmedziť na jednu ip.. len na refresh.. rovnaky uživatel môže stranku navštiviť o den neskôr.

beluský - velmi zložite riešenie

TGiJack - bud to nefunguje alebo tomu skôr nerozumiem :D

//a k ostatnym.. ano, toto je uplne mini projekt a vôbec do toho neťaham databazu.. nebude tam chodiť vela ludi, proste som chcel nejake jednoduche počitadlo bez použitia db.. akurat to nebolo domyslene ohladom toho refreshu.. jeden uživatel si tak pri jednom načitani stranky môže prostrednictvom refreshu zvyšovať čislo ako len chce, stači držať F5(nuda je nuda a tož ludia su svine :D) a taktiež uplne zbytočne zamestnava server a traffic
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

dvoma slovami - neda sa


session bude fungovat len ak ma uzivatel nastavene mazanie cookies pri zavreti prehliadaca ... inak session existuje dalej
mozno ak by si mu vnucoval sessid v URL tak by to islo

dalsie riesenie ze by si spravil "odchadzanie" zo stranky cez nejake "tlacitko" (= rusenie session) .. to ale asi nepomoze proti tomu kto chce skodit
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Príspevok od používateľa awtt »

ja by som to spravil tak že v index.php by bolo to čo chceš aby sa vykonalo, a na konci by som to redirector cez header na index2.php

užívateľovi by sa zobrazil len ten index2.php a teda po refreshe by sa nedialo nič
Old Dirty Bastard
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2658
Registrovaný: 13 júl 2006, 8:05
Bydlisko: phpbb_posts

Príspevok od používateľa Old Dirty Bastard »

awtt: nejak nechapem ako to mysliš :) uživatelovi sa zobrazi stranka, kde sa vykonava dana funkcia.. a kedy ho to ma presne redirectnuť na iny subor? cez meta redirect? tam by sa už zobrazovalo zmenene čislo o +1 bez funkcie? čiže by ho dalej nemohol zväčšovať? neviem ako to mysliš, toto sa mi zda dosť neprakticke
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

proste by bolo pocitanie pristupov oddelene od stranky (na prvej stranke by si zaratal pristup a presmeroval to v php cez header location) ... otazne je nakolko by ti to vyhovovalo ..
clovek by totiz mohol ist priamo na druhu stranku bez toho aby ho to zapocitalo .. aj ked aj to by sa dalo osetrit (cez referer)
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Príspevok od používateľa awtt »

presne tak, a pomocou

Kód: Vybrať všetko

$_SERVER['HTTP_REFERER']
zistiš, či ta predchadzajúca stránka bola navštívena, a prípadne to ošetriš
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

awtt napísal:presne tak, a pomocou

Kód: Vybrať všetko

$_SERVER['HTTP_REFERER']
zistiš, či ta predchadzajúca stránka bola navštívena, a prípadne to ošetriš
na to ale nepotrebuje dve stránky. Stačí zistiť či nejaký referer je (ak nie tak prišiel nový na stránku) a ak je, tak či je to ten index (ak hej, tak ide o refresh). Dva indexy sú úplne zbytočné
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

gwixt napísal:session bude fungovat len ak ma uzivatel nastavene mazanie cookies pri zavreti prehliadaca ... inak session existuje dalej
A dá sa v niektorom prehliadači nastaviť, aby sa cookie označené ako platné len počas jednej relácie (session) nevymazali? :)
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Príspevok od používateľa awtt »

audiotrack napísal:na to ale nepotrebuje dve stránky. Stačí zistiť či nejaký referer je (ak nie tak prišiel nový na stránku) a ak je, tak či je to ten index (ak hej, tak ide o refresh). Dva indexy sú úplne zbytočné
no nemyslím, lebo ak prišiel nový na stránku pri refreshe vždy bude referer prázdny
Napísať odpoveď