Autor Zpráva
Mav3rick
Profil *
Ahoj, chtěl bych požádat o pomoc při hledání nějaké chyby v mém přihlašovacím scriptu. Chování je následující: pokud do hlavičky "Location" zadám absolutní adresu natvrdo (např. "http://jakpsatweb.cz") přesměrování funguje. Pokud však chci použít data z formuláře či jakékoliv proměné (např. $_POST["return_url"]) script se chová, jako kdybych žádná data vůbec neodeslal zůstane na své adrese a znovu zobrazí formulář. Používám svou funkci pro přeměrování (redirect), ovšem v té chyba není, pokud použiju přímý zápis v podobě "header(Location... )" přímo uvnitř scriptu chová se naprosto stejně. Navíc ji už používám dlouho a nikdy jsem podobné problémy nezaznamenal. Doufám, že jsem to nepopsal moc zmateně. Předem moc díky za pomoc, nemohu se hnout z místa.
Můj kód
Alphard
Profil
Ověřil jste, že v $_POST["return_url"] je správná hodnota? Formulář není vidět. Na první pohled chybu nevidím, není čeho se chytit.
Nejlepší by bylo poslat celou sestavenou adresu do konzole, jestli máte nastavený Firebug, nebo jakkoliv vypsat.
Mav3rick
Profil *
Oveřil jsem to, nechal jsem si to vypsat printem. Zvláštní totiž je, že se provede jakákoliv funkce, kterou použiju, jen ne přeměrování. Pokud tam dám třeba print $_POST["return_url"]; formulář už se znovu nezobrazí a vypíše se mi správná adresa. Pokud tam však dám print $_POST["return_url"]; redirect($_POST["return_url"]; nestane se vůbec nic, ani se nevypíše adresa, jen se zase znovu objeví nevyplněný formulář, což je také zvláštní, mělo by zůstat vyplněno uživ. jméno. Chová se to, jako kdyby, když je tam ten redirect, ten script vůbec vůbec nebral v potaz ty data z formuláře. Celý kód i s formulářem je zde. Díky moc
AM_
Profil
zkus dát echo $_SERVER[SERVER_NAME]$root/$patch přímo do té funkce redirect.
Mám k tvému kódu pár kosmetických poznámek:
- zvaž na konec funkce dát die(). Obvykle po přesměrování není žádoucí, aby se skript stránky prováděl dál (a po pouhém zaslání header() se skript dál provádí, pouze ty už nevidíš jeho výsledek. Někdy to může mít i nežádoucí účinky, každopádně je to zbytečná zátěž serveru. Výjimečně je to žádoucí)
- nemusíš vůbec uvádět http://$_SERVER[SERVER_NAME]. header("Location: /test.php") funguje stejně (přesměrovává na aktuální server).
- nevidím ani moc rozumné do přesměrování dávat cestu (to co značíš jako $root), dělá to funkci spíše nešikovnou. Pokud chci přesměrovat na něco v aktuálním adresáři (např. z /test/1.php na /test/2.php), dám prostě header('location:2.php'); Pokud chci přesměrovat na 2.php v kořenovém adresáři webu (/2.php), dám header('location:/2.php'); Funkci bys podstatně zjednodušil a zešikovnil, kdybys tam dal prostě header("location: $redirect");
- patch je záplata. path je cesta.

Neber to šťourání nějak špatně, tvůj kód je kvalitnější než 90% toho, co se tu objevuje, a za pastebin chválím, jsou to jen takové mé postřehy, jak to vylepšit...
Mav3rick
Profil *
Tak jsem si nechal vypsat cestu přímo ve funkci a výsledek je stejný - adresa je správná, ale přesměrování se neprovede. Myslel jsem, že u Location je třeba uvádět absolutní cestu. Die jsem přidal. Vůbec to neberu špatně, jsem rád za konstruktivní kritiku. Ostatně chybami se člověk učí. Bohužel tu mou pořád nemohu najít.
Alphard
Profil
AM:
nemusíš vůbec uvádět http://$_SERVER[SERVER_NAME]. header("Location: /test.php") funguje stejně (přesměrovává na aktuální server).
K tomu mám poznámku zase já. Adresá má být dle dokumentace absolutní. I když relativní spolehlivě funguje, nevím, proč radíš to mazat.
Naopak jsem byl překvapen, že po dlouhé době vidím správně řešené přesměrování s adresou ve správném formátu a kódem 303.
Alphard
Profil
Mav3rick:
Tady se bude těžko hledat chyba, upravil jsem to do testovatelné podoby
<?php
function redirect($patch) {
  $root = substr($_SERVER["PHP_SELF"], 0, strrpos($_SERVER["PHP_SELF"], "/"));
  header("Location: http://$_SERVER[SERVER_NAME]$root/$patch", true, 303);
} #function redirect

    if (isset($_POST['submit_button']))
    {
      redirect('header_02.php');
    }
    else
    {
      echo '<form method="post"><input type="submit" name="submit_button"></form>';
    }
vyzkoušel a dle očekávání funguje.
Máte povolený výpis chyb? Aby to nakonec nebyl klasický BOM + potlačení hlášky Headers already sent…

Jestli nic nepomůže, tak zkuste spustit ten příklad výše a v závislosti na jeho funkčosti budem hledat problém.
AM_
Profil
Mav3rick:
Tak jsem si nechal vypsat cestu přímo ve funkci a výsledek je stejný - adresa je správná, ale přesměrování se neprovede.
- jak přesně ta adresa vypadá? napiš jí sem, třeba je chyba v ní, třeba si něčeho všimneme.
- jediná další možnost mě napadá ta, že před header() máš nějaký výstup a máš vypnuté chybové hlášky, a proto se skript nepřesměruje.

Alphard:
I když relativní spolehlivě funguje, nevím, proč radíš to mazat.
Jak říkáš, spolehlivě to funguje, a ten zápis je podle mě podstatně jednodušší. To, co říkáš, jsem nevěděl, děkuji za poučení, ale i nadále si stojím za svým zjednodušením. Pokud bys chtěl být echt důsledný, napsal bych funkci tak, aby automaticky detekovala typ adresy (relativní /absolutní cesta k souboru / absolutní URI tj. včetně protokolu a serveru) a převedla jej na absolutní URI.
Mav3rick
Profil *
Alphard:
Tady se bude těžko hledat chyba, upravil jsem to do testovatelné podoby
Přepsal jsem to podobně - resp. stačilo zakomentovat $_SESSIONy a přesměrování proběhne v pořádku. Nejsem si vědom, že by bylo nějaké omezení co se tohoto týče, jak pro sessions, tak pro header...
Nevím, co s tím. Co myslíte?
Alphard
Profil
Tak je třeba lokalizovat chybu, zkoušel jste
function redirect($patch) {
  //$root = substr($_SERVER["PHP_SELF"], 0, strrpos($_SERVER["PHP_SELF"], "/"));
  //header("Location: http://$_SERVER[SERVER_NAME]$root/$patch", true, 303);
  header("Location: http://php.net", true, 303);
  die("tohle nemelo byt videt");
}
a zbytek nechat stejný?

Žádná souvislost se session mě nenapadá.
Mav3rick
Profil *
Ano, vše jsem jinak nechal stejné...
Mav3rick
Profil *
Teď jsem na to kápnul, chyba byla ve scriptu, na který jsem odkazoval. Nikdy, ale už nikdy nebudu dělat něco bez průběžného testování po každém kroku. Myslel jsem, že pro definování sessions není potřeba je zapínat session_start();. Nicméně je to tak, tudíž se sessiona nevytvořila, nenaplnila daty a autentizační script vyhodnotil jako nepřihlášeno a vrátil mě zpět. Všem se strašně omlouvám za ztracený čas. Příště si budu už dávat pozor. Všem Vám také děkuji za zájem a ještě jednou se omlouvám.
Alphard
Profil
Mav3rick:
Myslel jsem, že pro definování sessions není potřeba je zapínat session_start();
V příspěvku [#7] jsem měl napsáno, jestli tam máte session_start(). Před odesláním jsem to smazal, že se na takovou blbost nebudu ptát :-)

Zřejmě jste si ale nezapl výpis chyb. To by muselo oznámit.

Aspoň AM zjistil, že se při přesměrování má používat absolutní adresa.

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