[PHP] Jak zabezpieczyć się przed wielokrotnym wykonywaniem kodu po odświeżeniu strony?
Chcesz aby pewien kod został wykonany tylko raz, nawet gdy użytkownik będzie odświeżał stronę.
Są takie fragmenty kodu, które nie powinny być wykonywane częściej niż raz na jedną odsłonę strony lub raz na jakiś czas (np. raz na 30 minut). Przykładem może być licznik odwiedzin - nie powinien dodawać odsłon stron podczas wielokrotnego odświeżania strony.
Wykorzystajmy cookie - pozwoli nam to w prosty sposób zabezpieczyć się przed wielokrotnym wywołaniem fragmentu kodu PHP. Na samej górze skryptu umieść linijkę kodu:
<?
if ($_COOKIE["jest"]<>1) setcookie("jest","1",mktime()+3600);
?>
Powyższa linijka będzie ustawiała cookie ważne przez 3600 sekund od chwili uruchomienia kodu. Jeżeli cookie zostanie ustawione, zmienna $_COOKIE["jest"] będzie miała wartość 1, w przeciwnym razie nie będzie miała żadnej wartości, bo po 3600 sekundach cookie wygaśnie i zostanie zlikwidowane.
Wystarczy więc na samym początku strony sprawdzić czy cookie jest ustawione, a jak nie, to ustawić je na wartość 1.
Teraz w dalszej części strony, możesz przetestować wartość cookie. Jeżeli cookie nie zostało jeszcze ustawione, to można wykonać skrypt (tutaj jest to pokazanie napisu "ten napis zobaczysz tylko raz na 3600 sekund").
<?
if ($_COOKIE["jest"]<>1) {
echo "ten napis zobaczysz tylko raz na 3600 sekund";
}
?>
Pierwsze załadowanie strony ustawi cookie, ale nie będzie można go od razu odczytać. Pobrać wartość cookie można dopiero po ponownym przeładowaniu strony i wtedy napis nie pojawi się już.
Po 3600 sekundach cookie zostanie skasowane i wtedy ponownie będzie można wykonać fragment skryptu umieszczony w drugim fragmencie kodu, a więc napis pojawi się dopiero po godzinie. Zamiast napisu możesz wstawić własny kod programu lub wywołanie dowolnych funkcji, np. zwiększenia licznika odwiedzin.
A oto podobna realizacja zadania, ale cookie ustawiane jest z poziomu JavaScript. Nie trzeba wtedy pamiętać o ustawianiu cookie na samym początku skryptu w PHP - możesz kod umieścić np. w środku skryptu.
<?
if ($_COOKIE["jest"]<>1) {
echo '
<script language="javascript" type="text/javascript">
<!--
var wygasa=new Date();
wygasa=new Date(wygasa.getTime()+1000*3600);
document.cookie="jest=1; expires="+wygasa.toGMTString();
// -->
</script>
';
// tutaj wstaw skrypt wykonany tylko raz
echo "ten napis zobaczysz tylko raz na 3600 sekund";
}
?>
Tutaj liczba sekund musi zostać pomnożona przez 1000, ponieważ w JavaScripcie miarą czasu jest milisekunda. Zasada działania skryptu jest identyczna. Ustawiamy cookie na określony czas i wykonujemy skrypt. Następne wykonanie skryptu następi w momencie gdy ważność cookie wygaśnie.