Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem - klasa obsługująca sesje
Forum PHP.pl > Forum > PHP
bonio89
Witam, zrobiłem prosty system logowania w którym klasy obsługują sesje i połączenia mysql.
Po zalogowaniu niestety zrywa się sesja.

Klasa sesji(Session.php):
  1. <?
  2. class Session{
  3.  
  4.  
  5. public function __construct(){
  6. if(!isset($_SESSION['logged'])){
  7. $_SESSION['logged']=false;
  8. }
  9. return true;
  10. }
  11. public function __destruct(){
  12. unset($_SESSION['logged']);
  13. }
  14. public function logoff($action){
  15. if($action=='wyloguj'){
  16. $_SESSION['logged']=false;
  17. }
  18. }
  19. public function csession(){
  20. if(!isset($_SESSION['logged']) || $_SESSION['logged']==false){
  21. echo "<script type=\"text/javascript\">window.setTimeout(\"window.location.replace('index.php');\", 1);</script>";
  22. $this->logoff('wyloguj');
  23. die('brak uprawnien') ;
  24. }
  25. }
  26. public function crequire($what){
  27. $in=get_included_files();
  28. foreach ($in as $filename) {
  29. if ($filename==$what){
  30. return true;
  31. }
  32. else{
  33. return false;
  34. }
  35. }
  36.  
  37. }
  38. public function cpermission($uname){
  39. if(!$this->crequire('Mysql.php')){
  40. require('Mysql.php');
  41. }
  42. $mysql = new Mysql();
  43. $row=$mysql->show('SELECT t.* FROM users u INNER JOIN utype t ON u.utype = t.id WHERE u.login = \''.$uname.'\'');
  44. unset($mysql);
  45. return $row['name'];
  46. }
  47. public function lapply($logged, $login, $ip){
  48. $_SESSION['logged']=$logged;
  49. $_SESSION['login']=$login;
  50. $_SESSION['ip']=$ip;
  51. }
  52. public function attset($att, $what){
  53. $_SESSION[$att]=$what;
  54. return true;
  55. }
  56. public function attget($what){
  57. return $_SESSION[$what];
  58. }
  59. public function attisset($what){
  60. if(isset($_SESSION[$what])){
  61. return true;
  62. }
  63. else{
  64. return false;
  65. }
  66. }
  67. }
  68. ?>


index.php
  1. <?
  2. require('../class/Session.php');
  3. require('../smarty/Smarty.class.php');
  4.  
  5. $session= new Session();
  6. $smarty = new Smarty();
  7. $smarty->setTemplateDir('../templates');
  8. $smarty->setCompileDir('../smarty/templates_c');
  9. $smarty->setCacheDir('../smarty/cache');
  10. $smarty->setConfigDir('../smarty/configs');
  11.  
  12. if(!isset($_POST['login'])){
  13. if ($session->attisset('logged')==false || $session->attget('logged')==false){
  14. $_SESSION['logged']=false;
  15. $smarty->assign('what', 'Podaj login');
  16. $smarty->display('admin_login.tpl');
  17. }
  18. }
  19.  
  20. else if ($session->attisset('logged') && $session->attget('logged')==true){
  21. /*if (!$session->attisset('logged')){
  22. session_regenerate_id();
  23.   $session->attset('inicjuj', true);
  24.   $session->attset('ip', $_SERVER['REMOTE_ADDR']);
  25. }
  26. if($session->attget('ip') != $_SERVER['REMOTE_ADDR']){
  27. die('Proba przejecia sesji udaremniona!');
  28. }
  29. */
  30.  
  31. if(isset($_GET['page'])){
  32. if(file_exists('../templates/admin_'.$_GET['page'].'.tpl') && file_exists($_GET['page'].'.php')){
  33. include $_GET['page'].'.php';
  34. }
  35. else{
  36. die('error 404: Page '.$_GET['page'].'not exists');
  37. }
  38. }
  39. else{
  40. include 'aktualnosci.php';
  41. }
  42. }
  43.  
  44. else if (isset($_POST['login'])){
  45.  
  46. require('../class/Mysql.php');
  47.  
  48. $mysql = new Mysql();
  49. $row=$mysql->show('SELECT time FROM users WHERE login = \''.$_POST['login'].'\'');
  50. $pass=sha1($_POST['pass']).md5($row['time']);
  51.  
  52. $result=$mysql->querry("SELECT * FROM users WHERE login = '" . $_POST['login'] . "' AND pass = '". $pass . "'");
  53.  
  54. if(mysql_num_rows($result)>0) {
  55. //echo'wynikow jest wiecej niz 0<br>';
  56. $session->lapply(true, $_POST['login'], $_SERVER['REMOTE_ADDR']);
  57.  
  58. echo "<script type=\"text/javascript\">
  59. window.setTimeout(\"window.location.replace('index.php?page=aktualnosci');\", 1);
  60. </script>";
  61. }
  62. else {
  63. $smarty->assign('what', 'Niepoprwane dane logowania');
  64. $smarty->display('admin_login.tpl');
  65. }
  66.  
  67. }
  68. ?>


Dodam iż klasa Mysql działa poprawnie, strona aktualnosci.php praktycznie nic nie zawiera oprócz przycisku wylogowania. O ile dobrze kojarzę to po przeładowaniu zrywa się sesja i tworzy nowa a ja chciałbym ją kontynuować. Macie jakieś pomysły?
Sephirus
Czemu masz zakomentowane session_start() w konstruktorze klasy?
CuteOne
Poczytaj o session_set_save_handler

ps. http://blog.perplexedlabs.com/2009/10/05/p...ession-handler/
Kofel
  1. if(!$this->crequire('Mysql.php')){
  2. require('Mysql.php');
  3. }

O chłopie tongue.gif. Sprawdź co to jest require_once.
bonio89
Cytat(Sephirus @ 21.02.2013, 08:30:58 ) *
Czemu masz zakomentowane session_start() w konstruktorze klasy?


Niehcący się zakomentował tutaj kawałek kodu, ale normalnie jest odkomentoway.

Cytat(CuteOne @ 21.02.2013, 08:51:24 ) *
Poczytaj o session_set_save_handler


Da się zrobić to bez użycia DB?

Dlaczego obiekt nie trzyma sesji po przeładowaniu? Nie powinien trzymać do czasu aż go zrobię unset?
Zauważyłem że po przeładowaniu strony działa destruktor. Co mogę zrobić aby destruktor zadziałał tylko w momencie niszczenia obiektu?
nospor
Cytat
Zauważyłem że po przeładowaniu strony działa destruktor. Co mogę zrobić aby destruktor zadziałał tylko w momencie niszczenia obiektu?

No właśnie po zakonczeniu strony, a konkretnie po zakończeniu żądania do php, niszczaone są wszystkie obiekty, a co za tym idzie odpalany jest twój destruktor smile.gif
Sephirus
jeśli chodzi Ci o niszczenie a dokładniej "unset" na tym obiekcie to może po prostu to sobie daruj i zamiast tego destruktora utwórz metodę (nie wiem powiedzmy logout albo cos w tym rodzaju), która (dopiero po jej manualnym wywołaniu) usunie dane sesji.

Rozumiem że ten destruktor miał działać jako wylogowywanie?
bonio89
Cytat(Sephirus @ 21.02.2013, 16:11:43 ) *
jeśli chodzi Ci o niszczenie a dokładniej "unset" na tym obiekcie to może po prostu to sobie daruj i zamiast tego destruktora utwórz metodę (nie wiem powiedzmy logout albo cos w tym rodzaju), która (dopiero po jej manualnym wywołaniu) usunie dane sesji.

Rozumiem że ten destruktor miał działać jako wylogowywanie?


Wywaliłem zawartość destruktora i działa wszystko tak jak powinno.
Destruktor miał docelowo "posprzątać".
Ehhh... szkoda że interpreter zawsze jest "mądrzejszy"...
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.