Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Komunikat przy zalogowanym drugim uzytkowniku
Forum PHP.pl > Forum > Przedszkole
rad11
Chcialbym sie was poradzic jak rozwiazac problem takiego typu ze mam logowanie na jedno konto moze sie zalogowac wielu uzytkownikow w tej chwili chce to ograniczyc do tego aby jesli uzytkownik jest juz zalogowany to logujacemu nowemu uzytkownikowi wyskakiwal komunikat ze juz ktos jest zlaogowany na tym koncie , a temu co jest zalogowany komunikat ze ktos probuje sie zalogowac. Jakies pomysly jak taki problem rozwiazac?
nospor
Zapisuj w bazie kto jest aktualnie zalogowany i jak ktos sie bedzie probowal logowac to sprawdzaj czy juz jest w bazie czy nie.
ikssde
Musisz mieć informację czy użytkownik się wylogował albo czy po prostu przerwał sesję, więc przy każdej odsłonie powinieneś wrzucać do bazy danych rekord, że zalogowany użytkownik jest aktywny.
Potem będziesz mógł sprawdzić kiedy była ostatnia aktywność i jeśli to było np. 15 minut temu (ważności sesji) to możesz stwierdzić, że ktoś po prostu zamknął przeglądarkę bez wylogowywania się i nie ma go na koncie.

W osobnej tabeli powinieneś trzymać informacje o próbach logowania.
rad11
A jak rozwiazac problem zwiazany z wygasnieciem sesji, a istnieniem rekordu ze niby uzytkownik jest zalogowany?
snerf
No proste ify? Z czym masz dokładniej problem. Napisz kod i zapytaj.

Tutaj moje rozwiązanie:
  1. public function check($ost_activ)
  2. {
  3. if(!empty($_SESSION['user_id']) && !empty($_SESSION['owner_ses'])){
  4. $timeout = $this->timeout;
  5. $owner_ses = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
  6.  
  7. if ((isset($_SESSION['last_active']) && $_SESSION['last_active']<(time()-$timeout))
  8. || (isset($_SESSION['owner_ses']) && $_SESSION['owner_ses']!=$owner_ses))
  9. {
  10. setcookie(session_name(), '', time()-3600, '/');
  11. header('Location: /index.html');
  12. }else{
  13. $_SESSION['last_active'] = time();
  14. $_SESSION['owner_ses'] = $owner_ses;
  15. if($ost_activ < time()){
  16. $this->last_visit_time = time()+$this->timeout_active;
  17. $pdo = $this->pdo;
  18. $stmt = $pdo -> prepare('UPDATE `'.$this->prefix_mysql.users.'` SET `time_activ` = :date WHERE `id` = :user_id AND `session_key` = :seskey');
  19. $stmt -> bindValue(':date', $this->last_visit_time, PDO::PARAM_INT);
  20. $stmt -> bindValue(':seskey', $owner_ses, PDO::PARAM_STR);
  21. $stmt -> bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);
  22. $stmt->execute();
  23. }
  24. }
  25. }
  26. }
ikssde
Cytat
A jak rozwiazac problem zwiazany z wygasnieciem sesji, a istnieniem rekordu ze niby uzytkownik jest zalogowany?


Przecież napisałem jak to rozwiązać, przeczytaj poprzedni post.
rad11
Mam taki kod (nie moj) w ktorym musze wcisnac warunek aby blokowac innego uzytkownika ktory probuje sie zalogowac:

login
  1. function login($showform = true, $redir = '/monitor') {
  2. global $_aa, $_prefix, $lg;
  3. $_aa['logged_in'] = false;
  4. // If login data present, check the key
  5. if (isset($_COOKIE['aausr'])) {
  6. $id = @intval($_COOKIE['aausr']);
  7.  
  8. if ("$id" == $_COOKIE['aausr']) {
  9.  
  10. $row = mysql_fetch_assoc(make_user_query('try_db_query', "SELECT * FROM <TABLE_USER> WHERE `id`='$id' LIMIT 1"));
  11. //print_r($row);
  12. if (is_array($row) && ($row['key'] == $_COOKIE['aakey'])) {
  13. if ($row['license_id'] > 0) {
  14. $_aa['logged_in'] = ($row['key'] == make_user_query('db_getv', "SELECT * FROM <TABLE_USER> WHERE `id`='" . ($row['license_id']) . "' LIMIT 1"));
  15. } else
  16. $_aa['logged_in'] = true;
  17.  
  18. if ($_aa['logged_in']) {
  19. $_aa = array_merge($_aa, $row);
  20. $security->setLogged($row);
  21. }
  22. }
  23. }
  24. }
  25. // If not logged in, display form
  26. if (!$_aa['logged_in']) {
  27.  
  28. if ($_POST['s'] == 'login') {
  29. $_POST['login'] = trim($_POST['login']);
  30. $_POST['pass'] = trim($_POST['pass']);
  31. //echo "CHeck";
  32. $res = loginCheck($_POST);
  33. //print_r($res);
  34.  
  35. if ($res['ok'] == 1) {
  36.  
  37. if ($res['active'] != 3) {
  38. setcookie('aausr', $res['id'], 0, '/');
  39. setcookie('aakey', $res['key'], 0, '/');
  40.  
  41. if (!$_COOKIE['pcid']) {
  42. srand(time());
  43. $_COOKIE['pcid'] = md5('dasdas' . rand());
  44. setcookie('pcid', $_COOKIE['pcid'], time() + 1500 * 24 * 3600, '/');
  45. }
  46. $security->setLogged($res['row']);
  47. }
  48.  
  49. $_aa['logged_in'] = true;
  50. unset($res['ok']);
  51. unset($res['row']);
  52. $_aa = array_merge($_aa, $res);
  53.  
  54. // Update last and current visit times, to enable tracking of new and old results
  55. make_user_query('try_db_query', $sql = "UPDATE <TABLE_USER> SET `last_visit`='{$_aa['curr_visit']}', `curr_visit`='" . time() . "' WHERE `id`='{$_aa['id']}'");
  56.  
  57. if ($_aa['license_id'] > 0)
  58. make_user_query('try_db_query', $sql = "UPDATE <TABLE_USER> SET `key`='" . $res['key'] . "' WHERE `id`='{$_aa['license_id']}'");
  59.  
  60. make_user_query('try_db_query', "INSERT INTO <TABLE_EVENTS> VALUES ('',
  61. '{$_aa['id']}',
  62. NOW(),
  63. 'login',
  64. '" . addslashes($_SERVER['REMOTE_ADDR']) . "',
  65. '" . addslashes($_COOKIE['pcid']) . "')");
  66.  
  67. $_aa['last_visit'] = $_aa['curr_visit'];
  68.  
  69. }
  70. } else
  71. $res = array();
  72.  
  73.  
  74. }
  75.  
  76. if ($_aa['logged_in'] && strlen($redir) > 0) {
  77. header('Location: ' . $redir);
  78. die();
  79. } else
  80. return true;
  81.  
  82.  
  83. }


logout

  1. function logout($logged_in) {
  2.  
  3. global $lg, $_aa;
  4.  
  5. // if ($logged_in == true) {
  6. // die();
  7. // } else {
  8. if (setcookie('aausr', '0', time() - 24 * 3600, '/') && setcookie('aakey', '')) {
  9.  
  10. $_aa['logged_in'] = false;
  11. unset($_COOKIE['aausr']);
  12. $security->setAuthenticated(false);
  13. $security->clear();
  14. header("Location: /");
  15. die();
  16.  
  17. containerStart(true);
  18.  
  19. return message($lg['logged_out'], $lg['logged_out_explain']);
  20. }
  21. // }
  22. }


Niby w bazie jest trzymany last visit current visit ale jak zablokowac na tej podstawie probe logowania innego uzytkownika hmmm?
snerf

1. zapisać czas + 15 minut

if czy jestem w sesji //typowa funkcja check jak podałem wyżej
//tak
else

if time() > $czas_z_bazy
//Niemoge sie zalogowac poniewaz ktos jest jeszcze zalogowany
else
//zaloguj + zapisz czas +15
//tworzy sesje
com
ikssde jak już to update a nie nowe rekordy bo zaraz wygeneruje ich sobie tysiące smile.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.