Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Dziwny problem z własnym mechanizmem sesji.
Forum PHP.pl > Forum > PHP
MajareQ
Najpierw może opis skryptu.
Skrypt ma za zadanie utworzyć nową sesję i w tej sesji może dowolnie zmieniać treść z bazy danych.
Taki mini panel admina.
Wykorzystuję AdoDB.
Mam tabelkę, w której utorzyłem m.in pole 'online'
Są dwie możliwości w online - Y albo N

plik systemy.php (do którego odnosi się plik cos.tpl, implantowany w każdym innym pliku)
wyszukuje wszystie rekordy z tabeli
tworzy nową sesję
nadaje danym sesyjnym wartośc danych wpisanych w POST
sprawdza czy dane sesyjne równają się danym z tabeli
jesli tak to tworzy nowe dane sesyjne z wartością prawidłowych danych
i zmienia status online na Y gdzie login i hasło równaja sie danym sesyjnym (prawidłowymi)

potem plik cos.tpl
sprawdza czy user z danych sesyjnych ma status Y
jesli tak to sprawdza i wyświetla nick i poziom autoryzacji usera
tutaj juz jest zawartość panelu admina
i jesli strone get równa sie logout to szuka usera w bazie zalogowanegio usera i ustawia mu status online N
niszczy sesje

----------------------

opis problemu:

po testach prawie wszystko działa...
sesje pamieta wszystko jest ok. tylko jak wylogowuję to ustawia status N, ale nie niszczy sesji
tzn. jak chcę zalogowac innego usera to ustawia status Y ale nie tworzy nowej sesji, bo porzednia jeszcze istnieje (sprawdzałem poprzez wyświetlanie session_id)

teraz podam pliki:

systemy.php:

  1. <?php
  2. require_once ('includes/config.php');
  3. $szukaj = $db -> Execute("SELECT * FROM sid");
  4. $sid = $szukaj -> fields['sid'];
  5. $pass = $szukaj -> fields['pass'];
  6. $_SESSION['postsid'] = $_POST['sid'];
  7. $_SESSION['postpass'] = $_POST['pass'];
  8. if ($_SESSION['postsid'] == $sid && $_SESSION['postpass'] == $pass) {
  9. $_SESSION['sid'] = $_SESSION['postsid'];
  10. $_SESSION['pass'] = $_SESSION['postpass'];
  11. $zaloguj = $db -> Execute("UPDATE sid SET online = 'Y' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  12. } 
  13. ?>


cos.tpl (tylko tresć php)

  1. <?php
  2. $online = $db -> Execute("SELECT online FROM sid WHERE sid = ".$_SESSION['sid']."");
  3. $zalogowany = $online -> fields['online'];
  4. if ($zalogowany == 'Y') {
  5. $ktojest = $db -> Execute("SELECT name FROM sid WHERE sid = ".$_SESSION['sid']."");
  6. $kto = $ktojest -> fields['name'];
  7. $poziom = $db -> Execute("SELECT auth FROM sid WHERE sid = ".$_SESSION['sid']."");
  8. $lvl = $poziom -> fields['auth'];
  9. echo'Witaj ';
  10. echo $kto;
  11. echo'<br />';
  12. if ($lvl == '1') {
  13. echo'Twój poziom administracyjny jest <b>najwyższy</b>, jesteś głównym administratorem.<br />';
  14. }
  15. echo'------------Opcje Admina------------<br />';
  16. if ($lvl == '1') {
  17. echo'opcje admina';
  18. }
  19. echo'opcje admina';
  20. echo'------------------------------------------------<br />';
  21. echo'<a href="?step=logout">Wyloguj</a>';
  22. if ($_GET['step'] == 'logout') {
  23. $wyloguj = $db -> Execute("UPDATE sid SET online = 'N' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  24. echo'<br />sesja wygaszona!';
  25. }
  26. }
  27. ?>
carbolymer
po zalogowaniu rób session_regenerate_id();
spróbuj wyczyścić przed zniszczeniem sesji: $_SESSION['sid'] i $_SESSION['pass'].
MajareQ
wyczyścić tzn mam zrobić
$_SESSION['sid'] = '';
$_SESSION['pass'] = '';

questionmark.gif
Axexis
Cytat(MajareQ @ 13.01.2008, 21:06:58 ) *
wyczyścić tzn mam zrobić
$_SESSION['sid'] = '';
$_SESSION['pass'] = '';

questionmark.gif


ew unset($_SESSION['sid']) i unset($_SESSION['pass']) smile.gif
MajareQ
hmmm w dalszym ciągu nic...
byłbym wdzięczny jakby ktoś przetestował ten skrypt u siebie...

aktualna wersja:

systemy.php:

  1. <?php
  2. require_once ('includes/config.php');
  3. $szukaj = $db -> Execute("SELECT * FROM sid");
  4. $sid = $szukaj -> fields['sid'];
  5. $pass = $szukaj -> fields['pass'];
  6. $_SESSION['postsid'] = $_POST['sid'];
  7. $_SESSION['postpass'] = $_POST['pass'];
  8. if ($_SESSION['postsid'] == $sid && $_SESSION['postpass'] == $pass) {
  9. $_SESSION['sid'] = $_SESSION['postsid'];
  10. $_SESSION['pass'] = $_SESSION['postpass'];
  11. $zaloguj = $db -> Execute("UPDATE sid SET online = 'Y' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  12. } 
  13. ?>


cos.tpl:
  1. <?php
  2. $online = $db -> Execute("SELECT online FROM sid WHERE sid = ".$_SESSION['sid']."");
  3. $zalogowany = $online -> fields['online'];
  4. if ($zalogowany == 'Y') {
  5. $ktojest = $db -> Execute("SELECT name FROM sid WHERE sid = ".$_SESSION['sid']."");
  6. $kto = $ktojest -> fields['name'];
  7. $poziom = $db -> Execute("SELECT auth FROM sid WHERE sid = ".$_SESSION['sid']."");
  8. $lvl = $poziom -> fields['auth'];
  9. echo'Witaj ';
  10. echo $kto;
  11. echo'<br />';
  12. if ($lvl == '1') {
  13. echo'Twój poziom administracyjny jest <b>najwyższy</b>, jesteś głównym administratorem.<br />';
  14. }
  15. echo'------------Opcje Admina------------<br />';
  16. if ($lvl == '1') {
  17. echo'<a href="admin/poczekalnia.php">Poczekalnia</a><br />';
  18. echo'<a href="admin/gracza.php">Dodaj Gracza</a><br />';
  19. echo'<a href="admin/banuj.php">Zabanuj IP</a><br />';
  20. }
  21. echo'<a href="admin/options.php">Zmień Opcje Gry</a><br />';
  22. echo'<a href="admin/players.php">Zmień Gracza/Opcje Graczy</a><br />';
  23. echo'<a href="admin/teksty.php">Zmień teksty z Bazy</a><br />';
  24. echo'<a href="admin/team.php">Zmień podstronę team.php</a><br />';
  25. echo'------------------------------------------------<br />';
  26. echo'<a href="?step=logout">Wyloguj</a>';
  27. if ($_GET['step'] == 'logout') {
  28. $wyloguj = $db -> Execute("UPDATE sid SET online = 'N' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  29. unset($_SESSION['sid']);
  30. unset($_SESSION['pass']);
  31. echo'<br />sesja wygaszona!';
  32. }
  33. }
  34. ?>
carbolymer
a w czym nadal jest problem? po zalogowaniu tworzy nowy id sesji. A jeżeli chcesz coś innego to wywołaj session_regenerate_id(true); zamiast session_regenerate_id();
MajareQ
problem jest w tym, że nie loguje nowego usera...
zmienia online na Y ale nie tworzy nowej sesji :/

edit:

sprawdziłem na drugim kompie (inna sesja)
loguje tylko SID 1 :/
carbolymer
ha! też miałem taki problem. ale zrobiłem do tego pewien myk... po zalogowaniu ustawialem $_SESSION['logged']=true; przed wylogowaniem $_SESSION['logged']=false; jeżeli $_SESSION['logged']=false; to umożliwiałem bezwarunkowo logowanie.

btw. pozdrawia zawada ;]
MajareQ
nie działa... :/ mógłbyś mi poprawic ten kod, bo ja się zaraz załamię... haha.gif

pozdrawia śródmieście haha.gif

mam mały progres, bo za każdym nowym logowanie SID 1 tworzy nową sesję...
ale wciąż nie loguje mi innego usera...

prosze o pomoc...

systemy.php:

  1. <?php
  2. require_once ('includes/config.php');
  3. $szukaj = $db -> Execute("SELECT * FROM sid");
  4. $sid = $szukaj -> fields['sid'];
  5. $pass = $szukaj -> fields['pass'];
  6. $_SESSION['postsid'] = $_POST['sid'];
  7. $_SESSION['postpass'] = $_POST['pass'];
  8. $_SESSION['logged'] = false;
  9. if ($_SESSION['postsid'] == $sid && $_SESSION['postpass'] == $pass) {
  10. $_SESSION['logged'] = true;
  11. if ($_SESSION['logged'] = true) {
  12. $_SESSION['sid'] = $_SESSION['postsid'];
  13. $_SESSION['pass'] = $_SESSION['postpass'];
  14. $zaloguj = $db -> Execute("UPDATE sid SET online = 'Y' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  15. } else {
  16. echo'You cant log in!';
  17. }
  18. } 
  19. ?>


cos.tpl:

  1. <?php
  2. $online = $db -> Execute("SELECT online FROM sid WHERE sid = ".$_SESSION['sid']."");
  3. $zalogowany = $online -> fields['online'];
  4. if ($zalogowany == 'Y') {
  5. $ktojest = $db -> Execute("SELECT name FROM sid WHERE sid = ".$_SESSION['sid']."");
  6. $kto = $ktojest -> fields['name'];
  7. $poziom = $db -> Execute("SELECT auth FROM sid WHERE sid = ".$_SESSION['sid']."");
  8. $lvl = $poziom -> fields['auth'];
  9. echo'Witaj ';
  10. echo $kto;
  11. echo'<br />';
  12. if ($lvl == '1') {
  13. echo'Twój poziom administracyjny jest <b>najwyższy</b>, jesteś głównym administratorem.<br />';
  14. }
  15. echo'------------Opcje Admina------------<br />';
  16. echo'<br />';
  17. echo'------------------------------------------------<br />';
  18. echo'<a href="?step=logout">Wyloguj</a>';
  19. if ($_GET['step'] == 'logout') {
  20. $wyloguj = $db -> Execute("UPDATE sid SET online = 'N' WHERE sid = '".$_SESSION['sid']."' AND pass = '".$_SESSION['pass']."'");
  21. $_SESSION['sid'] = '';
  22. $_SESSION['pass'] = '';
  23. $_SESSION['logged'] = false;
  24. echo'<br />sesja wygaszona!';
  25. }
  26. }
  27. ?>
netmare
Wybacz bo jakoś mocno się nie wczytałem, ale póki co wytłumacz mi dlaczego w cos.php nie ma session_start() questionmark.gif
MajareQ
widac ze sie nie wczytałęs...
nie ma cos.php tylko cos.tpl
a session_start jest w systemy.php
przeczytaj przynajmniej pierwszy post, ok?

Cytat(Axexis @ 13.01.2008, 21:11:08 ) *
ew unset($_SESSION['sid']) i unset($_SESSION['pass']) smile.gif


ewentualnie session_unset();

;P

questionmark.gif

questionmark.gif

questionmark.gif

questionmark.gif

questionmark.gif

questionmark.gif
Kocurro
I Ty chcesz by to działało ?

SELECT * FROM sid;

To Ci zwróci wszystkie wiersze z tabeli, odczytujesz pierwszy w którym założę się masz wpisane sid = 1 ... a potem porównujesz z tym odczytanym sid'em ...

Weź kartkę, ołówek w dłoń - rozrysuj co chcesz osiągnąć i napisz od nowa ...


A to, że sesja istnieje to niech sobie istnieje ... przecież może istnieć ... ja u siebie często loguję się jako różne osoby na tej samej sesji i działa - tyle, że trzeba umieć programować tak by sprzątać odpowiednio ...

pozdr.
MajareQ
odświeżasz starego kotleta...
już sobie dawno poradziłem... napisałem całkiem inaczej i nowy system.
temat do zamknięcia...
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.