Mám takový malý problém, ale nevím si s tím rady. Mám formlář, z kterého se mi přidávají data do databáze a zaroveň se mi podtím v zadaném třídění načítají. Problém je v tom, že po zmáčknutí Obnovit se přidá do databáze prázdný záznam. Je to stránka pro správu, takže tam nemám žádné kontroly. Jak tomu zamezit? Doufám, že mě nevynadáte do hňupů.
Chtelo by to nejakou podminku, ktera by tomu zamezila. Pokud je input (z formulare nejlepsi pres POST) prazdy, tak zastavit, nebo nekam presmerovat....
A nebo pokud je vstupni formular prazdny nebo nedefinovany (typicky pri reload), tak vynechat vlozeni do databaze a pokracovat az na vypisu.
V pohode to funguje.
A jeste lepsi je, aby ukladani samotne vracelo jen v hlavicce adresu na
dokument ohlasujici vysledek. Neulozi se to potom a historii a pri zpetnem prochazeni historii zabrani i opetovnemu vlozeni vyplneneho radku.
Viz Jiri Kosek - PHP (knizka)
A vůbec nejlepší je "jednorázové" akce dát do samostaného souboru. "Jednorázovými" akcemi rozuměj něco, co nemá proběhnout při každém načtení stránky. Stačí jednou a dost!
Nejtypičtějšími příklady je úprava databáze, přihlášení přihlašovacím skriptem, založení session, cookie, úprava souboru atd.
stranka.php
<?php
// tady je celá tvoje strának se všemi blbostmi
// obsahuje formulář
?>
<form action="jednorazova_akce.php" method="post">
<p>Login: <input type="text" name="login"></p>
<p>Login: <input type="password" name="heslo"></p>
<p><input type="submit" value="Odeslat"> <input type="reset" value="Vymazat"></p>
</form>
<?php
// a další věci
// jako např. zmiňovaný výpis z databáze
?>
Vyplněný formulář odešleš na skript:
jednorazova_akce.php
<?php
// nedorazily údaje
if (!IsSet($_POST['login']) || !IsSet($_POST['heslo']))
Die('Chyba: skriptu nebyly odeslány všechny potřebné údaje!');
// ošetření údajů - login: písmena, číslice, pomlčky, podtržítka, tečky; heslo: písmena, číslice
if (!EReg('^[a-zA-Z0-9_\-\.]{2,10}$', $_POST['login']) || !EReg('^[a-zA-Z0-9]{5,10}$', $_POST['heslo']))
Die('Chyba: odeslaná data obsahují nepovolené znaky!');
// převod na malá písmena a zašifrování hesla
$login = StrToLower($_POST['login']);
$heslo = MD5(StrToLower($_POST['heslo']));
$query = MySQL_Query('SELECT COUNT(*) FROM uzivatele WHERE login=\''.$login.'\' AND heslo=\''.$heslo.'\'');
if (MySQL_Result($query, 0, 0) == 1)
{
// spravny login i heslo
// muzu ho pustit dal
}
else
{
// NEspravny login nebo heslo
// NEmuzu ho pustit dal
}
Header('Location: http://'.$_SERVER['HTTP_HOST'].$root.'stranka.php');
?>
skript "jednorazova_akce.php" proběhne, udělá to, co má (v tomto případě přihlašuje uživatele) a pomocí hlavičky Location se vrátí zpět na danou stránku.
Obrovskou výhodou tohoto řešení je, že skript, který neobsahuje žádný výstup (echo, html kód, ...), jakým "jednorazova_akce.php" se ani nemůže uložit do historie prohlížeče. Uživatel pak nemůže nicvložit davkraát jen tím, že dá "zpět" nebo "aktualizovat".
Pavel
Header('Location: http://'.$_SERVER['HTTP_HOST'].$root.'stranka.php');
proměnná $root mi určuje, v jakém podadresáři na serveru se aplikace nachází. Klidně ji odtamtud vypust. Pak to bude vypadat takto:
Header('Location: http://'.$_SERVER['HTTP_HOST'].'/stranka.php');