Autor Zpráva
send
Profil *
Ahoj. Jak zamezit dvojímu odeslání dat z formuláře? Vím, že by se mělo vygenerovat ID, které zašlu s formulářem uživateli, vrátím si ho v hidden elementu a pak ID změním a budu mít už rozdílné ID. Ale jak to naprogramovat? Stačil by mi jen lehký návod. Lámu si hlavu s tím jak dostat ty ID do dvou proměnných pro porovnání (nepřepisovat si stále jednu)... Děkuji
bohyn
Profil
send:
Vytvoření tokenu a vložení do formuláře
// někam na začátek scriptu
session_start();
$token = md5(time());
$_SESSION[$token] = true;

// do formulaře pak vypiš toto
echo "<input type='hidden' name='token' value='{$token}'>";


Kontrola tokenu:
session_start();
if(isset($_POST['token']) && isset($_SESSION[$_POST['token']])) {
  unset($_SESSION[$_POST['token']]);
  
  // formulář odeslán v pořádku
}
else {
  // formulář byl odeslán podruhé
}
send
Profil *
bohyn:
Moc tomu nerozumím... Při prvním kliknutím na tlačítko budu mít nastaven $_POST['token'] a session také (aktuální datum) a odnastaví se mi session. Při druhém kliknutí se mi znovu nastaví session (jiné datum aktuálnější), změní se hodnota v hidden, takže podmínkou to projde také. Kde nastane ta změna při dalším odeslání? Díky
bohyn
Profil
send:
Pokud dá návštěvník refresh tak se odešle znovu starý token a ten touto validací neprojde. Pokud po odeslání návštěvník znovu vyplní formulář a odešle, tak to samozřejmě projde.

Edit: jinak znovuodeslání formuláře se dá ještě zabránit tím, že formulář zpracovává jiný script (třeba odeslat.php) a ten pak přesměruje prohlížeč hlavičkou header("Location: /formular.php", 303) zpátky na formulář (nebo jak je potřeba).
send
Profil *
bohyn:
Díky bohyne. Promiň, že s tím tak dlouho otravuju, ale ještě mi něco není jasné.

"Pokud dá návštěvník refresh tak se odešle znovu starý token a ten touto validací neprojde."
Tomu právě nerozumím. Při refreshi stránky (znovunačtení té samé) se mi přece na začátku skriptu změní $token, tím pádem i Session. A tento změněný token se pošle formulářem...
bohyn
Profil
send:
Pokud se odesláním formuláře dostaneš zpátky na stránku s formulářem tak script sice nastaví nový token, ale při refreshi se odesílá ten starý (prohlížeč si pamatuje co odeslal předtím) a ten neprojde protože už neexistuje v session. Pokud návštěvník znovu vyplní formulář a odešle tak to samozřejmě projde (a o to doufám jde).
send
Profil *
bohyn:
Díky, teď je mi to úplně jasný :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0