dezaktywacja zmiennej, -ych, po przekazaniu formularza

0

Witam!

Chodzi mi o sytuację kiedy przekazuję dane z formularza i po wciśnięciu np F5 - odśwież dodaje mi się kolejny rekord
Ja mam to zrobione tak

mam trzy strony
index.php
dod_form.php - formularz gdzie wpisuje się dane
dod_skrypt.php - strona dodająca rekord do bazy

w tagu form mam taki kod
<form method="post" action="?add=1">
na stronie index.php mam ifa który

if(isset($_GET['add'])==1)
        {
            include('dod_skrypt.php');
        } 

sprawdza czy istnieje zmienna $add która ma wartość 1 i wtedy odpala skrypt "dod_skrypt.php"

ale np po odświeżeniu strony (F5) dodaje mi się kolejny rekord do bazy. Mam więc 2 pytania:

  1. jak dezaktywować tą zmienną $add np nadać jej wartość 0 lub w ogóle ją wyłączyć/usunąć?
  2. czy dane przekazywane przez formularz znajdują się w jednej zmiennej ? np jakiejś tablicy którą także można wyłączyć/usunąć ?

z góry dzięki z podpowiedzi

0

możesz po obsłużeniu akcji dodawania (u Ciebie linijka z include) zrobić redirect na url już bez 'add' w GET (tzn header, a potem die/exit), byle nie ze statusem 301 Moved Permanently.
Nie jest to sposób doskonały, ale raczej się sprawdza :)

0

mogę poprosić o jakiś mini kod ? nigdy takiego czegoś nie robiłem i co to jest ten redirekt mniemam że to jakby ponowne odwołanie się do strony juz bez zmiennej add tak ?

0

po szybkim przeczytaniu kilku artów na temat redirect w PHP napisałem coś takiego i na razie działa

 
header("Location: ?s=zdarzenie");

czy to jedyny sposób czy są jakieś inne ?

ponawiam moje pytanie czy da się dezaktywować zmienną przekazaną przez link ? doczytałem że te zmienne są w $HTTP_GET_VARS ale przy kodzie np.

 
$HTTP+GET_VARS['add']=0;

nic się nie dzieje dalej dodaje rekordy

jeśli ktoś zna inny sposób proszę o dalsze posty na razie a redirect-em działa

0
if(isset($_GET['add'])==1)
        {
            include('dod_skrypt.php');
            header('Location: /index.php');
            die();
        } 

To akurat przekieruje po prostu na index.php, jeśli chcesz to możesz ten "index.php" sobie dowolnie zmienić.
Ważne - przed "header" nie możesz niczego wysłać do przeglądarki (żadnego echo, print, nic), więc albo obsłuż akcję przed wypisaniem czegokolwiek, albo zainteresuj się funkcjami stąd http://www.php.net/manual/en/ref.outcontrol.php

napisaliśmy prawie w jednej chwili. to niech zostanie, może komuś się przyda

a ja odpowiadam dalej - przy odświeżeniu przeglądarka po prostu powtarza ostatni request, więc wydaje mi się że inaczej tego nie obejdziesz; $_GET to zmienne przekazane w adresie, inaczej niż redirectem adresu nie zmienisz. Chyba że chce Ci się wojować JavaScriptem, jak chcesz to mam w którymś projekcie przykład, mogę znaleźć ;)

i nie używaj $HTTP_GET_VARS. zmienne są w $_GET, $HTTP_GET_VARS jest zdeprecjonowane, poza tym jest mniej wygodnie, bo nie jest superglobalne (tzn widoczne w każdym miejscu skryptu).

1

zamiast przekierowania możesz zrobić sobie przy okazji zabezpieczenie przez CSRF oraz przed podwójnym submitowaniem formularza, jak to działa:

  1. przy każdym generowaniu formularza dodajesz sobie do sesji losowy hash, np. $_SESSION['hashes'][$losowy_hash] = false. ten sam hash wstawiasz w ukryte pole formularza
  2. przy submitowaniu formularza: 1 sprawdzasz czy hash istnieje (isset) w sesji (jak nie - to albo formularz otwarty w innej sesji już, albo próba ataku CSRF), jeżeli istnieje i ma false - przyjmujesz dane z formularza, przetwarzasz je, ustawiasz w sesji na true - już użyty. jeżeli w sesji istnieje taki hash z true - to znaczy, że już te dane obsłużyłeś i nie dodajesz ich po raz kolejny

opcja prosta to po prostu przekierowanie

innych nie kojarzę ;)

0

ogólnie jest zasada że dane do serwera przesyła się metodą POST a odbiera metodą GET (stąd też nazwy)
przy odświeżaniu strony wysłanej metodą POST przeglądarka spyta czy wysłać dane jeszcze raz

najlepiej zrobić przekierowanie z POST na GET
i nie używać GET bo geta można użyć w imieniu kogoś innego choćby przez głupi obrazek w stopce (kiedyś się dało tak wylogować wszystkich z tego forum bo wylogowywanie było GETem bez żadnego zabezpieczenia)

0

@fgsd:
@klimba wysyła dane POST-em (widać po <form>), GET-em określa tylko akcję, co zrobić z danymi POST, a tu nie ma nic złego. Wiadomo jednak, że nie można wykonywać akcji modyfikującej cokolwiek tylko wg samego GET (w tym wylogowanie).

przy odświeżaniu strony wysłanej metodą POST przeglądarka spyta czy wysłać dane jeszcze raz

KAŻDY, dosłownie KAŻDY klika tam "ok". Przetestowane na wielu osobach. Także na tym polegać nie można.
No i gdyby jeszcze przeglądarka łaskawie wysłała żądanie GET zamiast POST po kliknięciu "anuluj" to by może i ludzie w to klikali - ale wtedy zazwyczaj mamy komunikat o wygaśnięciu podstrony czy coś w tym rodzaju.

1 użytkowników online, w tym zalogowanych: 0, gości: 1