Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> sesje, dziwna sprawa
Paweł :)
post
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


mam problem z sejsjami. skrypt inicjuje na początku sesję dla każdego użytkownika przez session_start(); następnie gdy chcę się zalogować jako administrator, pobiera dane z formularza, hasło koduje używając md5, sprawdza z danymi w bazie danych, jeśli są poprawne to zmienia datę ostatniego logowania zapisaną w bazie danych i dalej jest to:
  1. <?php
  2.  
  3. $_SESSION['gid'] = $gid;
  4. $_SESSION['gnick'] = $gnick;
  5. $_SESSION['gpass'] = $gpass;
  6. $_SESSION['gstat'] = $gstat;
  7.  
  8.  
  9. header("Location: admin.php");
  10.  
  11. ?>


ale... po przeniesieniu spowrotem do admin.php (funkcja is_user_login() powinna zwrócić teraz wartośc yes i powinno wyświetlić się menu admina) dane wpisywane są do sesji, ale inicjowana jest w tym samym momencie nowa sesja...

czy ktoś wie co z tym zrobić?



to jest pewnie wina header() gdyż nie dodaje do adresu id sesji. tylko czy da się coś zrobic, żeby automatycznie dodawało? trans-sid mam włączone w php.ini ...

Ten post edytował Paweł :) 29.12.2005, 03:01:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
ennics
post
Post #2





Grupa: Zarejestrowani
Postów: 312
Pomógł: 0
Dołączył: 29.12.2004

Ostrzeżenie: (0%)
-----


jak wygląda funkcja is_user_login() ?
Go to the top of the page
+Quote Post
brachu
post
Post #3





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 13.04.2005

Ostrzeżenie: (0%)
-----


Moment moment ale Ty konczysz sesje poprzez session_write_close() - z tego co wiem to ta funkcja dziala w ten sposob, ze zamyka bierzaca sesje i pozostawia do niej dostep np jezeli robisz cos na ramkach. Wydaje mi sie, ze to w tym tkwi problem.

Pozdro
Go to the top of the page
+Quote Post
Paweł :)
post
Post #4





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


na początku też tak myślałem, ale session_write_close() jest tylko po to by header() nie przekierował strony, zanim sesja będzie zapisana. bez session_write_close() jest tak samo.

funkcja is_user_login() :

  1. <?php
  2.  
  3. function is_user_login(){
  4. global $_SESSION, $users_tbl, $re;
  5. if (!isset($_SESSION['gnick'])) {
  6. $re = 'no';
  7. } else {
  8. $ggnick = $_SESSION['gnick'];
  9. $query = "SELECT * FROM $users_tbl WHERE nick='$ggnick' AND aktyw='ok'";
  10. $result = mysql_query($query);
  11. $r = mysql_fetch_array($result);
  12. $d = mysql_num_rows($result);
  13. if($d==1) {
  14. $id_ = $r['id'];
  15. $nick_ = $r['nick'];
  16. $pass_ = $r['pass'];
  17.  
  18. if($_SESSION['gnick']== $nick_ AND $_SESSION['gpass'] == $pass_) {
  19. $re = 'yes';
  20. } else {
  21. $re = 'no';
  22. }
  23.  
  24. } else {
  25. $re = 'no';
  26. }
  27. }
  28.  
  29. return $re;
  30.  
  31. }
  32.  
  33. ?>


W skrócie robi tak:
Najpierw sprawdza czy jest ustawiony gnick w pliku sesji, jeśli nie, zwraca wartość no czyli, że user jest niezalogowany. Jeżeli gnick jest zdefiniowane, sprawdza czy gnick i gpass są zgodne z zapisami w bazie danych (czyli czy user istnieje i czy hasło jest poprawne). Jeżeli wszystko jest ok, zwraca yes, jeżeli coś jest nie tak, to zwraca no.

Pozdrawiam
Go to the top of the page
+Quote Post
UDAT
post
Post #5





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


Spróbuj zainicjować sesję na początku każdego pliku, bo mi tylko tak działa (tzn. pliki inkludowane też muszą mieć session_start)
Go to the top of the page
+Quote Post
ennics
post
Post #6





Grupa: Zarejestrowani
Postów: 312
Pomógł: 0
Dołączył: 29.12.2004

Ostrzeżenie: (0%)
-----


$_SESSION jest tablicą superglobalna dostępną z każdego miejsca w aplikacji,
nie musisz więc wywoływac na jej rzecz global.
  1. <?php
  2.  
  3. function is_user_login(){
  4. global $users_tbl, $re; // po co globalizujesz $re i $users_tbl
  5. // $re to jest to co zwraca Twoja funkcja a $users_tbl lepiej przekazać jako jej a
    rgument np. is_usr_login($users_tbl);, unikaj globalizacji ;)
  6. //...
  7. $query = "SELECT * FROM $users_tbl WHERE nick='".$ggnick."' AND aktyw='ok'";
  8. // ...
  9. $re = 'no';
  10. } // czy poprawni to domknąłeś ?
  11. } else {
  12.  
  13. ?>


@UDAT, inicjowanie sesji dla każdego include jest zbędne

Ten post edytował ennics 29.12.2005, 16:55:16
Go to the top of the page
+Quote Post
Paweł :)
post
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


rzeczywiście, te dwa globale były tam niepotrzebnie, $user_tbl niestety musi zostać. sesja inicjowana jest zawsze (w pliku config.php, który jest includowany do każdej strony cms-u). Tam w is_user_login() wszystko jest ok, ta funkcja działa poprawnie.

Na 99% przeszkadza to:

  1. <?php
  2.  
  3. header("Location: admin.php");
  4.  
  5. ?>


gdyż nie dodawane jest do adresu id sesji (a ciasteczka mi nie trybią nie wiem czemu) czyli zapisuje dane usera do pliku sesji ale po tym tworzy nową sesję z której odtąd user korzysta... dlaczego trans-sid nie działa na adresy zapisane w header() (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ? jak to zrobic, by dodawal automatycznie wszystko co trzeba?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 13:40