Autor Zpráva
domix
Profil *
Zdrvím všechny,
rád bych dostal nějakou radu. Odesílám formulář (respektive zboží přidání do košíku) přes $_POST. Možná by to bylo elegantnější GET, k tomu se možná nakonec dopracuju... (mimochodem, co myslíte, že je lepší?)
Ale konkrétně k problému. Když odešlu daný formulář a dám obnovit, popř. se na danou stránku vrátím zobrazuje se klasická hláška:
K opětovnému zobrazení je nutné aby aplikace IE znovu odeslala data... bla bla bla OK
Lze se toho nějak zbavit? Zkoušel jsem Header Location s přesměrováním na stránku ze které se odesílají data, což problém v podstatě řeší ( header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); ), ale nejsem zase schopen rozlišit, jestli ze stránky byl právě formulář odeslán nebo ne...
A ještě jeden dotaz, kdy končí skript za použití funkce header(Location....) ? Nebo proběhne celej skript, ale nezobrazuje se output... to asi ne...
Díky moc!
Aleš Janda
Profil
POST - když se něco na serveru změní nebo při přihlašování (kvůli heslu)
GET - všechno ostatní

Přidání do košíku něco změní, takže tam nech to POST.

Zkoušel jsem Header Location s přesměrováním na stránku ze které se odesílají data, což problém v podstatě řeší

A to je také správné řešení

ale nejsem zase schopen rozlišit, jestli ze stránky byl právě formulář odeslán nebo ne

To zjistíš snadno - podle toho, jestli je něco v $_POST nebo ne :-)

A ještě jeden dotaz, kdy končí skript za použití funkce header(Location....) ? Nebo proběhne celej skript, ale nezobrazuje se output... to asi ne...

Skript nekončí, Header jen odešle hlavičku. Ukončit skript pak musíš sám (exit;)
sicario
Profil
Funkce header odesle hlavicku s danym obsahem. Jestlize skript generuje jeste nejaky vystup a nedoslo by k presmerovani, zobrazil by se normalne v prohlizeci. Proto je dobre skript po odeslani hlavicky Location ukoncit (exit, die).

Jestli byl formular odeslan lze urcit napr. pridanim dalsiho parametru
header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).'?ODESLANO=ANO '; )
nebo pomoci session.
nothrem
Profil
Pokud posíláš data POSTem, tak to máš bez problémů:
if (!empty($_POST))

{
//zpracuj a ulož odeslaná data
//...
header('Location: ...'); //redirect
}
else
{
//co se stane, pokud data nebyla odeslána - tedy po redirectu
}
domix
Profil *
Tak pánové, díky moc, já to měl vyřešený, ale hlavně jte mi pomohli tím ukončením skriptu (exit), bez toho to nejelo.

ještě pár poznámek:

to Aleš Janda
To zjistíš snadno - podle toho, jestli je něco v $_POST nebo ne :-)
Asi to nevyplynulo z kontextu, ale když tu stránku přesměruji na ten formulář, post je prázdný po tom přesměrování vždycky. (hodím sem kód, z toho to bude jasný)

to sicario:
Jestli byl formular odeslan lze urcit napr. pridanim dalsiho parametru
Tomu parametru jsem se chtěl vyhnout a zaráželo mě, že session nefunguje, jak jsem tedy zjistil, skrit asi proběhl dále, tak se session opět vrátili na implicitní hodnotu (viz. níže), exit to vyřešil, teď mi ale není jasný, jestli se ten skript parsuje celej... jestli jsem to pochopil, tak jo, ale já to ani nepostřehnu, protože se to hned přesměruje... (laicky řešeno)

jinak ten kód:


if ($_POST['add'] and ($_POST['qty'] > 0)) { //kontroluji odeslání formuláře
if (!$_SESSION['basket']) $_SESSION['basket'] = array(); //opatření proti warning pro array_key_exists
if (array_key_exists($_POST['add'], $_SESSION['basket'])) {
$_SESSION['basket'][$_POST['add']] += $_POST['qty']; //plnění košíku
} else {
$_SESSION['basket'][$_POST['add']] = $_POST['qty'];
}
$_SESSION['odeslano'] = 'OK';
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); //to avoid availability of page, přesměrování zpět na formulář
exit(); // !!!! KDYŽ TADY TEN EXIT NENÍ, TAK SE $_SESSION[ODESLANO] VYPRÁZDNÍ...
}
if ($_SESSION['odeslano'] == 'OK') {
$zbozi = 'Zboží bylo přidáno';
$_SESSION['odeslano'] = '';
} else {
$zbozi = '';
}

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:

0