Autor Zpráva
Brouzdalek
Profil
Pokouším se vytvořit skript, který má zabránit uživatelům v opakovaném odesílání stejného formuláře. K tomu jsem pomocí funkce vytvořil pro každý nově vytvořený formulář jedinečný 10-ti místný kód, který se spolu s daty ukládá do databáze a následně má pomoci s "lídáním uživatelů", viz:


<? // porovnávání jedinečných kódů žádostí
$sql1 = MySQL_Query("SELECT kod FROM $prefix".zadost." WHERE kod = ".$kod."");
if ($sql1) {
$sql2 = MySQL_Fetch_Array($sql1);
if ($sql2) {
$status = 0; }
else {
$status = 1; }
}
else {
$status = 1; }

// vytvoření podmínky pro odeslání do databáze
if (($zadatel && $platce && $cena && $zpusob_uhrady && datum_splatnost && $ucel) != "") {
if ($status = 1) {

... následuje další kód /např. vložení do databáze


Proměnná $sql1 vyhledává v databázi kód, který odpovídá právě odeslanému kódu. Zobrazené podmínky jsou založeny na "chybě" - tedy, pokud nastane chyba v $sql1 nebo $sql2, proměnná $status získává hodnotu 0. Dle napsaných podmínek (a vyplěnní všech povinných polí - 1. podmínka) - $status = 1, se má skript provést.

Problém je ovšem v tom, že mi tento skript nefunguje, a nemůžu nalést chybu. Ani mě nenapadlo lepší řešení v zabránění odesílání stejného formuláře. Taky mě napadly SESSIONS, ale v rámci možností (tj. opakovanému odeslání nových žádostí), nevidím tuto možnost jako reálnou.

Uvítám každý názor a radu, všem předem díky.
Alphard
Profil
řešení pomocí header() nestačí?
Brouzdalek
Profil
To jsem taky zkoušel, tedy pokud máš n mysli tohle:


Header("Location: nazev_stranky.pripona")


Ale nezabrání to uživatelům vrátit se na předchozí stránku, tedy došlo by k opětovnému uložení...
Joker
Profil
No ovšem pokud se uživatel vrátí a ten formulář znovu odešle, možná ví proč to dělá, ne?
Brouzdalek
Profil
To jo, ale když ho odešle znovu, tzn. načte nový prázdný formulář, vytvoří se v něm i nový kód, který se s odesláním žádosti uloží do databáze.
Pokud poté už. využije tlačítka ZPĚT, načte se formulář s kódem, který je již uložen v databázi, a poté se INSERT neprovede.
To je ovšem teorie, praxe je trošku horší :-/
Alphard
Profil
$sql1 = MySQL_Query("SELECT kod FROM $prefix".zadost." WHERE kod = ".$kod."");
zadost je konstanta?

co prostě
list ($kod) = mysql_fetch_row (mysql_query ("SELECT count(kod) FROM $prefix".zadost." WHERE kod = ".$kod));

if ($kod)
echo "kód již je v databázi";
else
echo "ještě není";
Brouzdalek
Profil
Ten prefix mě udává předponu tabulky v databázi. Mám to kvůli variabilitě. Takže např. system_zadost = název této tabulky.

Co je to "list" ? Jo jo, je to dobrej nápad, sečíst mnžoství stejnýho kódu, jdu to zkusit....
Brouzdalek
Profil
Tak jsem to zkusil, ale pořád se mi do do dtb. ukládá znovu a znovu, viz:


list ($sql) = MySQL_Fetch_Row (MySQL_Query("SELECT count(kod) FROM $prefix".zadost." WHERE kod = ".$kod));
if ($sql) {
$status = 0; }
else {
$status = 1; }

// vytvoření podmínky pro odeslání do databáze
if (($zadatel && $platce && $cena && $zpusob_uhrady && datum_splatnost && $ucel) != "") {
if ($status = 1) {

...

Brouzdalek
Profil
Už jsem přišel na řešení, dle knížky od Koska:



$path = SubStr($SCRIPT_NAME, 0, StrRPos($SCRIPT_NAME, "/"))."/faktury_zadost_info.php?status=$status";

Header("Location: http://$SERVER_NAME:$SERVER_PORT$path");
DFly
Profil
no vidis, a jses zase na zacatku... Header()
a funguje to i bez absolutni cesty (i kdyz http protokol to pro Location urcuje jako absolutni)

nicmene se to da take resit scriptem, ktery kontroluje, zda posledni vlozeny zaznam od daneho uzivatele neni obsahem stejny
Alphard
Profil
if ($status = 1) {
padlo mi to do oka až teď, takže pro příště, operátor porovnání je v PHP ==

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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