Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie, sesje.
Forum PHP.pl > Forum > PHP
MagnuM
Witam,

ja się wiążę z takim problemem że mam zrobione logowanie na stronie na sesjach. Użytkownik wpisuje login, hasło, te dane przechodzą do funkcji logowania, w tej funkcji pobierane są odpowiednie dane z bazy i jeżeli jest odpowedni login i hasło do niego to następuje taka jakby autoryzacja - tzn. zmienna $_SESSION["USER_AUTH"] przybiera wartość true, później zmienna $_SESSION["USER_LOGIN"] przybiera wartość loginu danego użytkownika. I teraz użytkownik widzi na ekranie link który przekierowuje go do pewnej podstrony, na której to wywoływana jest funkcja która na podstawie tej zmiennej $_SESSION["USER_LOGIN"] pobiera z bazy resztę danych. Jak wiadomo takie rozwiązanie, że użytkownik musi indywidualnie kliknąć na link za bardzo mu nie sprzyja. Więc zdecydowałem się na przekierowanie - tzn:

Kod
<meta http-equiv="Refresh" content="0; URL=index.php?page=siedziba">


Problem jest tego typu że na ie u mnie wszystko działa w pożądku(ie z sp2). Znajomi mówią jednak że u nich na ie poprzez to przekierowanie logowanie nie jest przeprowadzane poprawnie (to jest ie z sp1). Poprzez zwykły link do tej strony wszystko działa w pożądku.

Z moich obserwacji wynika że poprzez przekierowanie nie są przekazywane zmienne globalne na niektórych wersjach przeglądarek. Czy jest na to jakaś rada?

Pozdrawiam.
who?
Hej,
Ja zawsze korzystam z takiego przekierowania w php:

Kod
header ("Location: www.costam.pl");
exit;


Niestety musi być na samym początku strony... to znacz musi zostać wykonane przed jakimkolwiek wysłaniem danych do przeglarki.

POZDRAWIAM
who?
TomASS
Cytat
Niestety musi być na samym początku strony... to znacz musi zostać wykonane przed jakimkolwiek wysłaniem danych do przeglarki.


Dlaczego niestety? smile.gif Przecierz jak masz zamiar odrazu (automatycznie) gdzieś skoczyć, to nie interesuje Cię co wyświeli przeglądarka tongue.gif


Ja mam to robione w ten sposób, że w skrypcie logowania mam (gdy użytkownik się autoryzuje), zapytanie, które wybiera z bazy danych na jaką stronę przeglądarka ma się przekierować:
  1. <?php
  2.  
  3. header("Location: ".$USER['Strona']);
  4.  
  5. ?>


gdzie $USER['Strona']) to strona na którą należy przekierować danego użytkownika.
MagnuM
Problem w tym że ja musze wysłać te zmienne do przeglądarki :/
TomASS
Jakie zmienne? Trzymaj je w sesjach.
revyag
  1. <?php
  2. header("Location: ".$USER['Strona'].SID);
  3. ?>
MagnuM
ok, no więc strona logowania wygląda następująco:

  1. <?
  2.  
  3. $user = strip_tags($_POST['nick']);
  4. $pass = strip_tags($_POST['haslo']);
  5.  
  6. if(login($user, $pass))
  7. {
  8. header("Location: index.php?page=siedziba". SESID);
  9. echo("aaa");
  10. }
  11. ?>


Ale header nie działa :/
who?
Cytat(MagnuM @ 2005-09-28 16:54:49)
Ale header nie działa :/

Zapomniałeś o "exit;" na końcu.

POZDRAWIAM,
who?
MagnuM
No więc header dalej nie działa, po wielu dziwnych próbach.

W wiązku z tym zacząłem próbować z javascriptem.

Mam takie pytanie. Czy instrukcja location.reload(); koniecznie musi pokazywać jakieś dziwne komunikaty przy wywołaniu? Nie może się odrazu wywoływać odswiezenie? Jest na to jakoś sposób?
TomASS
Cytat(who? @ 2005-09-28 20:38:04)
Cytat(MagnuM @ 2005-09-28 16:54:49)
Ale header nie działa :/

Zapomniałeś o "exit;" na końcu.

POZDRAWIAM,
who?

Wcale nie musi być exit, ale za to powinno być na samym początkusession_start().

Czy to na pewno cały kod?

Co do location.reload(); to zapewne wyświetla się okienko, że strona wygasła, jest to spowodowane tym, że wracasz do strony do której dane zostały wysłane metodą POST, może jak byś spróbował GETem to by pomogło?
MagnuM
Kiepska sprawa przekazywać login i hasło w URL-u :/ A ja dalej nie mogę soie poradzić.
revyag
Nie tak:
  1. <?php
  2. header("Location: index.php?page=siedziba". SESID);
  3. ?>

tylko tak:
  1. <?php
  2. header("Location: index.php?page=siedziba&amp;". SESID);
  3. ?>

to zasadnicza różnica jednego ampersanda snitch.gif
MagnuM
Skoro żaden ze sposobów tu wymienionych nie przyniósł zamierzonego skutku, opiszę sprawę dokładniej.

index.php

pliczek w którym jest wywoływana funkcja session_start(), tu includowane są wszelkie pliki: pliki z funkcjami, lewe menu, prawe oraz środek(który jest zamienny, zaleznie od $_GET['page']).

login.php

formularz do logowania

login2.php

plik w którym wywoływana jest funkcja logowania

funkcja logowania

najpierw sprawdzane są wszystkie warunki, czy login pasuje do hasła i inne pierdoły, jeżeli wszystkie warunki są spełnione to dochodzi do logowania i wtedy wywoływany jest następujący kod:

  1. $_SESSION["USER_AUTH"]  = True;
  2. $_SESSION["USER_LOGIN"] = $sqlUser;
  3.  
  4. $log = date("Y-m-d");
  5. mysql_query("UPDATE user SET log='$log' WHERE login='$sqlUser'");
  6.  
  7. echo ("<p><center>Witaj <b>$nick</b></center>");
  8. echo ("<p><center><a href="index.php?page=siedziba&".SESID."">KLIK!</a><p>Trwa przekierowanie!</center>");
  9.  
  10. ?>
  11. <meta http-equiv="Refresh" content="0; URL=index.php?page=siedziba&<? echo (SESID) ?>">
  12. <?


Jak widać w tym miejscu następuje przekierowanie do index.php, ze srodkiem siedziba.php. W tym czasie w index.php wywoływana jest funkcja user_dane(), która na podstawie zmiennej $_SESSION["USER_LOGIN"] pobiera z bazy wszystkie dane dotyczące danego użytkownika. Później includowana jest ta strona siedziba.php która wyświetla te dane odrazu.


Problem jest tego typu że na moim komputerze działa to znakomicie. Normalnie się loguję wypełniając formularz, pokazuje mi się informacja że trwa przekierowanie i za chwile pojawia mi się strona siedziba.php z danymi dotyczącymi mojego konta. U moich znajomych zaś występuje problem taki, jakby nie wykonywana była funkcja user_dane(). Dane nie są poprawnie wyświetlane na stronie :/ Czyli drogą dedukcji możliwe że zmienna $_SESSION["USER_LOGIN"] nie jest przesyłana pomiędzy stronami. Problem rozwiązuje się jeżeli ręcznie klikną na link przekierowujący do tej strony, a nie będą czekać na przekierowanie.

Ma ktoś jakiś pomysł?
strife
Witam,

Wydaje mi się że na stronie logowania nie masz session_start" title="Zobacz w manualu php" target="_manual dlatego nie jest przekazywana dalej zmienna sesyjna. Jeśli myślisz że ta zmienna nie jest przekazywana zrób mały debug, na końcu umieść np.
  1. <?php
  2.  
  3. var_export($_SESSION);
  4.  
  5. ?>

I zobacz czy jest.. Natomiast jeśli nie działa Ci header" title="Zobacz w manualu php" target="_manual i nie wyskakuje Ci żaden błąd to myślę że masz wyłączone raportowanie błędów. error_reporting" title="Zobacz w manualu php" target="_manual

Pozdrawiam!
MagnuM
Dodałem wszędzie session_start i problem jest u innych, a u mnie działa prawidłowo sad.gif U mnie przekierowanie i wejscie poprzez link działają, a u znajomych działa tylko wejscie poprzez link. Podczas przekierowania tak jakby te zmienne sesyjne gdzieś uciekały :/
s_w_ir
Chwila. Skrypt testujesz na swoim kompie, prawda? Ale Twoi znajomi też wchodzą na Twój komp jako na serwer, czy wysyłasz skrypty na jakiś hosting?
MagnuM
Wysyłam na serwer.
s_w_ir
No i wchodziłeś na ten server żeby sprawdzić czy to dziala, czy tylko u siebie na kompie sprawdzasz?
MagnuM
Jasne ze na ten serwer ;-)
Arrow
witam,

moze oni maja jakies specyficzne ustawienia zabezpieczen ?

  1. <?php
  2.  
  3. if ($password === $pass) {
  4.  
  5. $_SESSION['zalogowany'] = true;
  6.  }
  7. else {
  8. $_SESSION['zalogowany'] = false;
  9.  }
  10.  
  11. ?>


inne pliki sprawdzaja pozniej wartosc tej zmiennej i to wszytsko, dziala wszedzie
strife
Cytat(MagnuM @ 2005-10-03 07:11:22)
Jasne ze na ten serwer ;-)

blink.gif Tak można w kółko się pytać, napisz bardziej szczegłowe dane, jeśli Ty wchodzisz na serwer i Ci nie działa to podaj jakiej używasz do tego przeglądarki internetowej, a jakiej inni że im działa?

Zrobiłeś też debug na końcu pliku aby wykluczyć złe przekazywanie zmiennych, i to raportowanie błędów??, patrz post niżej...smile.gif
MagnuM
No właśnie najgłupsze jest to że ja używam IE (+ avant browser) i u mnie działa. Koledzy na FF też normalnie się logują, zaś na u nich na ie występuje problem który jest spowodowany nie przesyłaniem się zmiennej sesyjnej między stronami.

Jak zmieniłem z sesji na POST to u mnie też występował ten problem, ale tutaj jst uzasadnienie bo POST nie można tak zwyczjanie bez formularza przesyłać między stronami.

Spójrzcie jeszcze na post na którym opisałem jak działa całe logowanie. Przeciez wsyztsko wygląda logicznie. Zmienne są w sesji i odczytuje je na następnej stronie.

Hmm ale z drugiej strony u nich nawet na ie działa po kliknięciu w link (zauważcie że tam są dwa sposoby logowania , można kliknąć w link oraz jest przekierowanie). Może podczas tego przekierowania zmienne gdzieś giną ?
latet
Cytat(revyag @ 2005-09-29 06:22:19)
Nie tak:
  1. <?php
  2. header("Location: index.php?page=siedziba". SESID);
  3. ?>

tylko tak:
  1. <?php
  2. header("Location: index.php?page=siedziba&amp;". SESID);
  3. ?>

to zasadnicza różnica jednego ampersanda snitch.gif

Jeśli można spytać, bo nie rozumiem: po co w takich przypadkach na końcu linku daje się SID? Czy to jest na wypadek niedziałania cookies? No bo skoro normalnie ID sesji siedzi w cookie, to po co dublować ten identyfikator wstawiając go w URL?

Dzięki,

latet
revyag
Jeśli polegasz na ciachach to nie trzeba tego dodawać. Ja to robię tak "na wszelki wypadek", jakby user miał coś z ciastkami zamieszane snitch.gif
latet
Cytat(revyag @ 2005-10-04 07:08:48)
Jeśli polegasz na ciachach to nie trzeba tego dodawać. Ja to robię tak "na wszelki wypadek", jakby user miał coś z ciastkami zamieszane snitch.gif

Rozumiem, ale i nie rozumiem....
Przetesowałem i jak sobie wyłączyłem w przeglądarce ciastka, to sesja (wcześniej) i tek nie została powołana do życia. Nie było więc SID. I taki link z SID i tak już nie miałby sensu.

A z drugiej strony - jeśli ciacha działają i SID siedzi w nich, to czy takie dublowanie tego w linku nie spowoduje jakichś problemów?

PS.
Nie rozumiem czemu ludzie celowo wyłączają u siebie ciastka. Tak, słyszałem o "tracking cookies", ale czy to naprawdę jest groźne? Może ktoś objaśnić na czym polega ich niebezpieczeństwo (i mechanizm działania) w najczarniejszym scenariuszu?

P.S.2
Jak zgrabie w php wykryć, że user ma wyłączone cookies (aby wyświetlić mu odpowieni komunikat)? Ustawić cookie i sprawdzić czy zostało ustawione? No tak... ale nie wiem jak w takiej sytuacji odróżnić czy jest to pierwsze uruchomienie skryptu i cookie jeszcze nie może istnieć, czy już kolejne i istnieć powinno. Sesją tego nie załatawię, bo przecież to co chcę sprawdzić, to czy sesja może w ogóle zacząć działać.

Dzięki,

latet
revyag
Cytat(latet @ 2005-10-04 08:23:55)
Przetesowałem i jak sobie wyłączyłem w przeglądarce ciastka, to sesja (wcześniej) i tek nie została powołana do życia. Nie było więc SID. I taki link z SID i tak już nie miałby sensu.

Może masz ustawione w php.ini session.use_only_cookies. Wtedy sesja po stronie klienta będzie przechowywana tylko w cookies. Więc kiedy je zablokujesz, nie będzie możliwoście przekazywania jej przez URL.
latet
Cytat(revyag @ 2005-10-04 07:43:32)
Cytat(latet @ 2005-10-04 08:23:55)
Przetesowałem i jak sobie wyłączyłem w przeglądarce ciastka, to sesja (wcześniej) i tek nie została powołana do życia. Nie było więc SID. I taki link z SID i tak już nie miałby sensu.

Może masz ustawione w php.ini session.use_only_cookies. Wtedy sesja po stronie klienta będzie przechowywana tylko w cookies. Więc kiedy je zablokujesz, nie będzie możliwoście przekazywania jej przez URL.

Mozliwe. Nie mam dostępu ani do podglądu phpinfo(), ani tym bardziej do php.ini.

latet
Czarnulson
Witam.

Mam problem z przekierowaniem do indexu gdyz pojawia mi sie:
Cannot modify header information - headers already sent by

Wszystko poza tym dziala prawidlowo ale nie znam innego sposobu przekierowania do indexu sad.gif

  1. index.php
  2.  
  3. <?php
  4. include("funkcje.php");
  5. ?>
  6.  
  7. <HTML>
  8. <HEAD>
  9.  
  10. <TITLE>ebiblioteka</TITLE>
  11. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1250" />
  12. <link rel="stylesheet" type="text/css" href="styl.css" />
  13. </HEAD>
  14. <BODY BGCOLOR="#FFFFFF">
  15.  
  16. <TABLE align="center" WIDTH="768" BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>
  17. <TD id="logfield" ROWSPAN="3" WIDTH="244" HEIGHT="295" >
  18. <?php
  19. include('logfield.php');
  20. ?>
  21.  
  22. </TD>
  23. <TD><IMG SRC="images/ebiblioteka_02.gif" WIDTH="143" HEIGHT="37" /></TD>
  24. <TD><IMG SRC="images/ebiblioteka_03.gif" WIDTH="126" HEIGHT="37" /></TD>
  25. <TD><IMG SRC="images/ebiblioteka_04.gif" WIDTH="123" HEIGHT="37" /></TD>
  26. <TD><IMG SRC="images/ebiblioteka_05.gif" WIDTH="132" HEIGHT="37" /></TD>
  27. </TR><TR>
  28. <TD COLSPAN="4"><IMG SRC="images/ebiblioteka_06.gif" WIDTH="524" HEIGHT="222" /></TD>
  29. </TR><TR>
  30. <TD COLSPAN="4"><IMG SRC="images/ebiblioteka_07.gif" WIDTH="524" HEIGHT="36" /></TD>
  31. </TR><TR>
  32. <TD id="panel" WIDTH="244" HEIGHT="470">
  33.  
  34.  
  35.  
  36.  
  37.  
  38. </TD>
  39. <TD id="main" COLSPAN="4" WIDTH="524" HEIGHT="470" >
  40.  
  41.  
  42. </TD>
  43. </TR><TR>
  44. <TD COLSPAN="5"><IMG SRC="images/ebiblioteka_10.gif" WIDTH="768" HEIGHT="29" /></TD>
  45. </TR></TABLE>
  46.  
  47.  
  48. </BODY>
  49. </HTML>


  1. logfield.php
  2.  
  3. <?php
  4.  
  5.  
  6. function form(){
  7. echo '<form method = "post" action = "index.php">
  8. <table align = "center"><tr><td><b>Email:</b></td>
  9. <td><input name = "user" type = "text"></td>
  10. </tr><tr><TD><b>Haslo:</b></TD><td><input name ="pass" type = "password"></td>
  11. </tr><tr><td align = "center" colspan = "2"><input type = "submit" value = "Zaloguj"></td>
  12. </table></form>';
  13. }
  14.  
  15. if (isset($_SESSION['user'])){
  16.  
  17. if($action!="logout"){
  18. echo 'witaj';
  19. echo '<br>';
  20. echo '<a href="?action=logout">wyloguj</a>';
  21. }
  22. else{
  23. form();
  24.  
  25. }
  26. }
  27. else{
  28.  
  29. $user=$_POST['user'];
  30. $pass=$_POST['pass'];
  31.  
  32.  
  33. if($user==NULL && $pass==NULL)
  34. {
  35. form();
  36. }
  37. else
  38. {
  39. # sprawdzanie czy zmiennym przypisane zostaly jakies wartosci
  40. if ($user==TRUE && $pass==TRUE)
  41. {
  42. # przypisanie zmiennej wynik loginu (w przypadku gdy login zgadza sie z haslem)
  43. $wynik=mysql_query("SELECT e_mail FROM czytelnik WHERE e_mail='$user' AND haslo='$pass'");
  44.  
  45. #jesli wartosc jest rozna od jeden znaczy to ze danego loginu nie ma w bazie
  46. if(mysql_num_rows($wynik)!=1)
  47. {
  48. echo "Niestety podany uzytkownik nie istnieje! Prosze sprobowac ponownie";
  49. form();
  50. }
  51. # jesli login i haslo sa poprawne wyswietli sie panel administracyjny
  52. else
  53. {
  54. $_SESSION['user'] = $user;
  55. header( 'Location: index.php?'.SID );
  56.  
  57. }
  58.  
  59. }
  60. else #jesli jakies pole zostanie pominiete pojawi sie informacja
  61. {
  62. echo "Blad! Musisz wypelnic wszystkie pola!";
  63. form();
  64. }
  65. }
  66.  
  67. }
  68.  
  69. ?>


bylbym wdzieczny za kazda pomoc
Cysiaczek
Są dwa wyjścia:
1. Piszesz skrypt tak, żeby ewentualne przekierowanie przez funkcję header() odbyło się zanim wyślesz jakikolwiek znak do przeglądarki.

2. Używasz funkcji buforujących zaczynając od ob_start() + pokrewne

Pozdrawiam.
Czarnulson
Dzieki wielkie smile.gif

Jeszcze jedno pytanie. Czy istnieje mozliwosc aby np. po zalogowaniu po okreslonym czasie (ustalonym przeze mnie) nastapilo przekierowanie na inna strone?

pozdrawiam
Cysiaczek
Temat: Automatyczne odswiezanie
http://developer.mozilla.org/en/docs/DOM:window.location

Musisz tylko generować kod JavaScript z php, jeśli chcesz mieć możliwość dynamicznej zmiany czasu (np z panelu administracyjnego strony)

Pozdrawiam.
krzysiekk
czesc nie wiem czy temat rozwiazany czy nie

<cytat z ksiazki dotyczacy heder>

docelowy adres musi zawierac nazwe protokolu i nazwe komputera nie moze sia skladac jedynie z sciezki dostepu do pliku

heder('Location: http://www.cos.com/index.php'); // poparawne
heder('Location: index.php'); // nie poparawne
strife
Cytat(krzysiekk @ 16.12.2006, 21:10:01 ) *
czesc nie wiem czy temat rozwiazany czy nie

<cytat z ksiazki dotyczacy heder>

docelowy adres musi zawierac nazwe protokolu i nazwe komputera nie moze sia skladac jedynie z sciezki dostepu do pliku

heder('Location: http://www.cos.com/index.php'); // poparawne
heder('Location: index.php'); // nie poparawne

W książce jest heder, no to "fajna" książka.. biggrin.gif Jak już masz pisać jak jest poprawnie to chociaż sprawdź to winksmiley.jpg
latet
Cytat(krzysiekk @ 16.12.2006, 20:10:01 ) *
czesc nie wiem czy temat rozwiazany czy nie

<cytat z ksiazki dotyczacy heder>

docelowy adres musi zawierac nazwe protokolu i nazwe komputera nie moze sia skladac jedynie z sciezki dostepu do pliku

heder('Location: http://www.cos.com/index.php'); // poparawne
heder('Location: index.php'); // nie poparawne


A nie działa to poprawne wolniej? No bo, wiecie, jakoś tak okrężną drogą?

latet
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.