Użytkownik: Hasło:

Nie masz konta? Zarejestruj się

Zarabianie na stronach www

Na początek

T-www-orzenie

Zarabianie na www

Ocena stron www

Własne forum na www

Różniste

Blokada odświeżania strony po wysłaniu danych z formularza » sesja.

Wprowadzenie

Jest to bardzo przydatny skrypt. Zapobiega on ponownemu wysłaniu danych z formularza - po wysłaniu tych danych i odświeżeniu strony.

Z pewnością większość z Was używa na swych stronach różnego rodzaju formularzy - kontakt (e-mail), komentarze, oceny itp. Często zdarza się, że użytkownicy po wypełnieniu formularza i wysłania wprowadzonych danych - odświeża stronę. Nie wiem dlaczego tak robią. Być może nie otrzymują żadnego komunikatu po udanym transferze? Na moich stronach taki komunikat otrzymują. Niestety mimo to, część z nich odświeża jeszcze stronę. Postanowiłem więc napisać jakiś skrypt - uniemożliwiający ponowne przesłanie danych.

Sposób 1

Wykorzystamy w nim zmienną sesji, której przyporządkujemy odpowiednią unikalną wartość - po wysłaniu danych. Przed ich następnym wysłaniem - skrypt sprawdzi, czy zmienna sesji nie ma już tej unikalnej wartości (dla każdej strony innej). Jeżeli ma - nie wyśle ponownie danych. No, ale od początku.

Zastanówmy się najpierw jaką wartość przyporządkować sesji, aby dla każdej strony była inna. Najlogiczniejszym rozwiązanie wydaje się wykorzystanie adresu www (url), który przecież dla każdej strony jest inny. Tak też zrobimy :)
Wykrywamy więc adres strony:

$adres =$_SERVER[′PHP_SELF′];

Zmiennej $adres zostanie przyporządkowany adres strony. W tym przypadku taki: /skrypty-blokada-odswiezania.php, czyli zgadza się.
Teraz musimy (po wysłaniu danych) - przyporządkować zmiennej sesji ten adres i wprowadzić wyrażenie warunkowe, które zapobiegnie ich ponownemku wysłaniu (pierwsza linijka kodu).

if (isset($_POST[′submit′]) AND $_SESSION[′blok_odsw′] != $adres) {
...wprowadź dane z formularza...
$_SESSION[′blok_odsw′] = $adres;
} else if (isset($_POST[′submit′]) AND $_SESSION[′blok_odsw′] == $adres) {
$komunikat = "Proszę nie robić sobie jaj i nie odświeżać strony!";
}

Kiedy po raz pierwszy wysyłamy dane - zmienna sesji o nazwie klucza "blok_odsw" (może być dowolna inna) nie jest jeszcze ustawiona. Wprowadza więc dane z formularza, a dopiero po ich wprowadzeniu - ustawia wartość sesji (trzecia linijka kodu - przed pierwszą klamrą zamykającą). Jeżeli odświeżymy teraz stronę - wyrażenie warunkowe w pierwszej linijce wykryje że wartość sesji jest taka sama jak adres obecnej strony www, i wykona akcje zawarte w drugim nawiasie klamrowym (po else if), gdzie warunek zostanie spełniony - w tym wypadku wyśle komunikat żeby sobie nie robić jaj ;)

Oto cały skrypt przykładowej strony:

<?php
session_start();

$adres =$_SERVER[′PHP_SELF′];

if (isset($_POST[′submit′]) AND $_SESSION[′blok_odsw′] != $adres) {
...wprowadź dane z formularza...
$_SESSION[′blok_odsw′] = $adres;
} else if (isset($_POST[′submit′]) AND $_SESSION[′blok_odsw′] == $adres) {
$komunikat = "Proszę nie robić sobie jaj i nie odświeżać strony!";
}
?>

<html>
<head>
...mety i te inne...
</head>
<body>
...kod strony...
<?php
if (isset($komunikat)) {
echo"$komunikat";
}
?>
...a w tym kodzie w końcu - formularz:...
<form action="" method="post">
<p>Imię: <input type="text" name="imie" /></p>
<p>Komentarz: <br />
<textarea name="komentarz" cols="50" rows="3"></textarea></p>
<input type="submit" name="submit" value="wyślij" />
</form>
...ewentualnie dalszy kod strony...
</body>
</html>

Objaśnienie skryptu

Kod każdej strony, na której odnosimy się do zmiennych sesji, musi zaczynać się wyrażeniem inicjującym sesję - session_start(). Ważne aby przed tym wyrażeniem nie był wysłany żaden kod HTML, nawet pusta spacja - inaczej otrzymamy komunikat o błędzie: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at...

Dalej przyporządkowujemy zmiennej $adres - aktualny adres strony www.

Następnie mamy kod który aktywowany jest po kliknięciu przycisku wysyłającego dane. Wyrażenie warunkowe:
if (isset($_POST[′submit′]) AND $_SESSION[′blok_odsw′] != $adres). Sprawdza on, czy został wciśnięty przycisk wysyłający dane z formularza i czy zmienna sesji, o nazwie "blok_odsw" nie ma wartości, którą jest adres aktualnej strony. Jeżeli warunek jest spełniony - przetwarza dane z formularza (np. wprowadza do bazy danych), a po ich przetworzeniu - nadaje zmiennej sesji, o nazwie "blok_odsw" wartość, którą jest adres aktualnej strony.
Jeżeli odświeżymy stronę - warunek nie zostanie spełniony, ponieważ zmienna sesji ma już wartość, którą jest adres aktualnej strony. Zostanie więc wykonana akcja, która spełnia warunek drugi (wciśnięty przycisk i wartość sesji "blok_odsw" jest adresem strony): $komunikat = "Proszę nie robić sobie jaj i nie odświeżać strony!";. Ma ona na celu przyporządkowanie zmiennej $komunikat wartości, którą jest zdanie z prośbą o nie robienie sobie jaj.

Teraz możemy już wstawiać kod HTML strony występujacy przed kodem formularza.

Następnie przechodzimy do umieszczenia kodu PHP, który sprawdza, czy jest zainicjowana zmienna $komunikat. Jeżeli jest - wyświetla jej treść.

Dalej jest reszta kodu HTML, wraz z kodem formularza.

Zauważ, że internauta nie ma możliwości ponownego wysłania danych, nawet jeżeli nie odświeży strony. Będzie mógł to uczynić dopiero po zamknięciu i ponownym otwarciu przeglądarki - wtedy zmienne sesji są usuwane.
W formularzu poniżej użyłem jednak innego sposobu (2), więc nie ma żadnego komunikatu - mimo to - dane wysyłane są tylko raz :)

sposób 2 »


Komentarze do tego artykułu (7)

Shao (2008-05-17) Komentarz 1

Ja bym dolozyl cos takiego:
if (!(isset($_POST['submit'])) AND $_SESSION['blok_odsw'] == $adres) {
...resetowanie blokady...
$_SESSION['blok_odsw'] = "";
}
Strony nie bedzie mozna odswiezyc ale formularz bedzie mozna ponownie wypelnic.

www-4u (2008-10-18) Komentarz 2

W sumie to chodziło też o to, żeby nie można było wysłać ponownie formularza (np. żeby się komentarze jednego autora nie dublowały). Jeżeli ktoś jednak chce aby użytkownik miał taką możliwość - to sugestia @Shao jest jak najbardziej w porządku.

Kshyhoo (2009-07-03) Komentarz 3

A jak to zrobić w formularzu wielostopniowym?

joe (2009-07-28) Komentarz 4

A ja właśnie szukam dodatku do FF, który umożliwiłby przeładowanie strony poprzez wybranie przycisku na tej stronie.

działa (2010-08-23) Komentarz 5

faktycznie działa dobrze:)

hmmm (2010-11-12) Komentarz 6

Jak powinno wyglądać zastąpienie linijki "...wprowadź dane z formularza..." normalnym kodem PHP?

www-4u (2010-11-23) Komentarz 7

@hmmm, w każdym wypadku inaczej, w zależności od tego jakie dane wprowadzasz i jak wygląda Twoja baza danych. Wystarczy do tego podstawowa znajomość php i mysql.

Linki sponsorowane

Skomentuj ten artykuł (zadaj pytanie).

Twój Nick:

Numer komentarza na który odpowiadasz
Jeżeli nie odpowiadasz na konkretny komentarz pozostaw to pole puste.

Twój Komentarz: (Proszę, nie wstawiaj linków ani kodu HTML)

© copyright: www-4u.pl

powrót na górę strony