Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sesje
Forum PHP.pl > Forum > Przedszkole
Paweł :)
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 ...
ennics
jak wygląda funkcja is_user_login() ?
brachu
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
Paweł :)
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
UDAT
Spróbuj zainicjować sesję na początku każdego pliku, bo mi tylko tak działa (tzn. pliki inkludowane też muszą mieć session_start)
ennics
$_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
Paweł :)
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() questionmark.gifquestionmark.gifquestionmark.gif? jak to zrobic, by dodawal automatycznie wszystko co trzeba?questionmark.gif
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.