Autor | Zpráva | ||
---|---|---|---|
Mav3rick Profil * |
#1 · Zasláno: 16. 8. 2010, 02:09:27
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 |
#2 · Zasláno: 16. 8. 2010, 02:40:11
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 * |
#3 · Zasláno: 16. 8. 2010, 18:02:58
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 |
#4 · Zasláno: 16. 8. 2010, 18:47:15
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 * |
#5 · Zasláno: 16. 8. 2010, 19:35:31
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 |
#6 · Zasláno: 16. 8. 2010, 19:39:58
AM:
„nemusíš vůbec uvádět ht>tp://$_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 |
#7 · Zasláno: 16. 8. 2010, 19:53:41
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>'; } 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 |
#8 · Zasláno: 16. 8. 2010, 19:55:44
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 * |
#9 · Zasláno: 16. 8. 2010, 20:14:57
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 |
#10 · Zasláno: 16. 8. 2010, 20:45:34
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"); } Žádná souvislost se session mě nenapadá. |
||
Mav3rick Profil * |
#11 · Zasláno: 16. 8. 2010, 20:59:09
Ano, vše jsem jinak nechal stejné...
|
||
Mav3rick Profil * |
#12 · Zasláno: 16. 8. 2010, 21:02:50
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 |
#13 · Zasláno: 16. 8. 2010, 21:23:40 · Upravil/a: Alphard
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. |
||
Časová prodleva: 15 let
|
0