logowanie, sesja

0

Cześć wszystkim, szukałem wiele w internecie i nie znalazłem nic dotyczące mojej sprawy.

Mam formularz logowania i rejestracji. No i potrzebuję zrobić takie coś że w bazie bedzie mi zapisywać kto i kiedy był zalogowany, kiedy się zalogował(data, czas), kiedy wylogował(data, czas). Jeżeli znacie strony w których jest takie coś podane to proszę o linki. Dziękuję

1
Pryzmat12 napisał(a):

Cześć wszystkim, szukałem wiele w internecie i nie znalazłem nic dotyczące mojej sprawy.

Mam formularz logowania i rejestracji. No i potrzebuję zrobić takie coś że w bazie bedzie mi zapisywać kto i kiedy był zalogowany, kiedy się zalogował(data, czas), kiedy wylogował(data, czas). Jeżeli znacie strony w których jest takie coś podane to proszę o linki. Dziękuję

Stwórz sobie tabelę w bazie z 4 polami
id | user_id | action_type | created_at

No i po prostu w momencie gdy ktoś przechodzi proces logowania (od razu po zalogowaniu) lub przy wylogowywaniu dodajesz do tej tabeli rekord gdzie
user_id to id użytkownika
action_type - tworzysz sobie enumerator jakiś, żeby kod był czytelniejszy i przypisujesz sobie np. że 1 będzie oznaczała logowanie, 2 wylogowanie.
created_at - czas wykonania akcji (czyli "teraz" - moment w którym jest wywołane zapytanie do bazy).

Musisz też pamiętać, że sesja (defaultowo) ma ważność 1440sekund - 24minut. Jeżeli w Twojej intencji też jest wyłapywanie przypadków, gdzie ktoś sam się nie wylogował manualnie, ale po prostu jego sesja wygasła, więc i automatycznie został wylogowany, to musisz w jakiś sposób sprawdzać, czy dany użytkownik wykonał jakąkolwiek akcję przez ostatnie (defaultowo) 24minuty.

0

Napisz tak:

if($login && $password) {
   $_SESSION['time_log'] = (new DateTime)->format('Y m d H i s');
}

Reszta analogicznie.

0

ok, tylko mam już kolumne id, user, password, email, wiec dołożyć do nich prawda to user_id i te inne?? jakiego one mają być typu? Być może kojarzysz strone która mi pomoże w tym co napisałeś( w twoich wytycznych). Dziękuję

1
Pryzmat12 napisał(a):

ok, tylko mam już kolumne id, user, password, email, wiec dołożyć do nich prawda to user_id i te inne?? jakiego one mają być typu? Być może kojarzysz strone która mi pomoże w tym co napisałeś( w twoich wytycznych). Dziękuję

Nie, nie masz dokładać pól do tabeli z użytkownikiem. Jeżeli chcesz stworzyć historię logowań, to musisz mieć osobną tabelę.
Nie bez powodu wymieniłem tam user_id, które ma się odwoływać do identyfikatora usera. Po prostu tworzy nam się tutaj związek One to Many.

Przykład:

Zakładamy że masz w bazie 2 użytkowników i następującą tabelę z użytkownikami.
id | email | password
1 | adam.nowak@gmail.com | XYZ...
2 | jan.kowalski@gmail.com | ZXC...

Teraz jeżeli użytkownik Jan Kowalski (2) nam się zaloguje mamy drugą tabelę w której dodajemy rekord:
id | user_id | action_type | created_at
1 | 2 | 1 | 2018-06-25 16:00:00

Ok, więc teraz ten sam użytkownik się wylogował 10minut później i zalogował po godzinie.
n(jakieś tam id - primary key)
n | 2 | 2 | 2018-06-25 16:10:00
5212 | 2 | 1 | 2018-06-25 17:10:00

Następnie utracił sesję po 24 minutach i zalogował się ponownie po 30 (łącznie z tymi 24)
5272 | 2 | 1 | 2018-06-25 17:40:00

W tym momencie nasza tabela z historią logowań i wylogowań wygląda np. tak:
id | user_id | action_type | created_at
1 | 2 | 1 | 2018-06-25 16:00:00 - logowanie
333 | 2 | 2 | 2018-06-25 16:10:00 - wylogowanie
5212 | 2 | 1 | 2018-06-25 17:10:00 - logowanie
5272 | 2 | 1 | 2018-06-25 17:40:00 - logowanie

W międzyczasie oczywiście logować mogli się inni użytkownicy
id | user_id | action_type | created_at
1  | 2 | 1 | 2018-06-25 16:00:00 - logowanie 2 użytkownika
2  | 1 | 1 | 2018-06-25 16:05:00 - logowanie 1 użytkownika
3  | 2 | 2 | 2018-06-25 16:10:00 - wylogowanie 2 użytkownika
4  | 1 | 1 | 2018-06-25 16:46:00 - logowanie 1 użytkownika
5  | 2 | 1 | 2018-06-25 17:10:00 - logowanie 2 użytkownika
6  | 1 | 2 | 2018-06-25 17:25:00 - wylogowanie 1 użytkownika
7  | 2 | 1 | 2018-06-25 17:40:00 - logowanie 2 użytkownika

Nie wiem czy jest jakaś strona z tym, bo rozwiązanie wypisałem własne z pomysłu który akurat przyszedł mi do głowy. Szukaj pod nazwami "user login history" itp. a następnie modyfikuj rozwiązania pod siebie.
Przykładowy link (masę innych linków znajdziesz chociażby po wpisaniu "user login history" w google, jak to zaznaczyłem wyżej):
https://stackoverflow.com/questions/18950477/creating-log-in-history

0

no dobra, postaram się to tak zrobić ale te 2 ostatnie kolumny mają być typu date i time?

0

sorki znaczy pierwsze 3 to typ int a ostatnia datetime w bazie?

0

Tak

0

dobra stworzone i co dalej jak to wszystko wywoływać? jestem zielony. Nie chce gotowca po prostu jakieś podpowiedzi

0

Masz obsłużone już logowanie ? Wpadają Ci rekordy do bazy danych?

0

w sensie rejestracja uzytkownika i logowanie mam, ale jak robić aby mi np uzytkownik admin z bazy o nazwie logowanie wskoczył do bazy o nazwie historia abym widział kiedy się logował, i wylogowywał? Czy musze dodać do bazy logowanie jeszcze cos?
Baza logowanie:

0

nie wiem czy mam je jakoś powiązac tą historie o kolumnach co mi mesh podał?

0

Nie musisz nic dodawać do bazy logowania. Po prostu wykonaj zapytanie INSERT do bazy historia z odpowiednimi danymi i tyle.

0

zaloguj.php

<?php
	session_start();
	
	if ((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
	{
		header('Location: panel.php');
		exit();
	}

require_once "connect.php";
try
{
$polaczenie = @new mysqli($host,$db_user,$db_password,$db_name);

if ($polaczenie->connect_errno!=0)
{
	throw new Exception(mysqli_connect_errno());
}
else
{
$login = $_POST['login'];
$haslo = $_POST['haslo'];

$login = htmlentities($login, ENT_QUOTES, "UTF-8");
//$haslo = htmlentities($haslo, ENT_QUOTES, "UTF-8");

if ($rezultat = $polaczenie->query(sprintf("SELECT * FROM logowanie WHERE user='%s'",mysqli_real_escape_string($polaczenie,$login))))
{
	$ilu_userow = $rezultat->num_rows;
	if ($ilu_userow>0)
	{
		$wiersz = $rezultat->fetch_assoc();

		if (password_verify($haslo,$wiersz['pass'])) 
		{
				$_SESSION['zalogowany'] = true;
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['user'] = $wiersz['user'];

				unset($_SESSION['blad']);
				$rezultat->free_result();
				header('Location: index1.php');
		}
		else 
		{
			$_SESSION['blad'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
			header("Location: panel.php");
		}

		} 
		else
		{
			$_SESSION['blad'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
			header("Location: panel.php");
		}
}
else
{
	throw new Exception($polaczenie->error);
}
$polaczenie->close(); 
}
}
catch(Exception $e)
    {
      echo '<span style="color:red;">Błąd serwera!</span>';
     // echo '<br /> Informacja developerska: '.$e;
    }
?>
0

w tym pliku zapewne to zapisać?

0
if (password_verify($haslo,$wiersz['pass'])) 
        {
                $_SESSION['zalogowany'] = true;
                $_SESSION['id'] = $wiersz['id'];
                $_SESSION['user'] = $wiersz['user'];

                $query = $polaczenie->query("INSERT INTO historia (user_id,action_type,created_at) VALUES('id_usera','2','now()')");
                
                unset($_SESSION['blad']);
                $rezultat->free_result();
                header('Location: index1.php');
        }

Możesz spróbować z tym zapytaniem przypisanym do $query

0

dałem to zapuytanie lecz gdy zaloguje np uzytkownika kamil to dalej nic sie nie pojawia w tabeli historia, est pusta

0

sorki miałem crated_at a nie created_at lecz pojawiło się tak:

0

Pokaż jak zapisałeś tego INSERTA. Czy na pewno masz typ pola created_at ustawiony na Datetime?

0

pytanie czy dobrze mam tą tabele?

i jak mam mi pobrac id usera z tabeli logowanie, bo mi tu daje 0 np. admin ma id=1, kamil ma id = 4?

$query = $polaczenie->query("INSERT INTO historia (user_id,action_type,crated_at) VALUES('id','2','now()')");

0

Id usera masz już przecież w $wiersz['id'] . Stworz sobie nową zmienną przed tym zapytaniem $id = $wiersz['id'] i wtedy VALUES('$id','2','now()')");

0
MatKib77 napisał(a):

Id usera masz już przecież w $wiersz['id'] . Stworz sobie nową zmienną przed tym zapytaniem $id = $wiersz['id'] i wtedy VALUES('$id','2','now()')");

prawda głupek ze mnie :D patrzyłem ale się nie połapałem
ale coś mi to datetime nie pyka, hmm same zera coś tu jest nie tak?

0

Spróbuj : $date = date('Y-m-d H:i:s');
VALUES('$id','2','$date')");

0

no super działa, ja bym się nigdy nie skapnął że to tak prosto można zrobić, ale teraz musze zrobić wylogowanie i jeśli ten ktoś utraci sesje 24 minuty. To musi być analogicznie? w sensie:

$query = $polaczenie->query("INSERT INTO historia (user_id,action_type,created_at) VALUES('$id','1','$date')");

plik wyloguj.php - w tym pliku musze dac tego inserta??

<?php

	session_start();
	
	session_unset();
	
	header('Location: panel.php');

?>
0

Tak, jeśli ten plik odpowiada za wylogowanie użytkownika, to w tym miejscu musisz umieścić instrukcję INSERT

0

pokombinowałem troszkę przerobiłem plik i wszystko mi zapisuje ale user_id ma znów 0 tym razem przy wylogowaniu a np admin ma id= 1 wiec powinno być id = 1 a jest 0, fajnie bo action_type przy kliknieciu wyloguj zapisuje do bazy 1 czyli sie wszystko zgadza ale ten user_id mi daje w kość, co poradzić??

<?php

	session_start();
	
	session_unset();
	require_once "connect.php";

$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);

if ($polaczenie->connect_errno!=0){
	echo "błąd serwera";
}		
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['user'] = $wiersz['user'];
				$id = $wiersz['id'];
				$date = date('Y-m-d H:i:s');

	$query = $polaczenie->query("INSERT INTO historia (user_id,action_type,created_at) VALUES('$id','1','$date')");

	header('Location: panel.php');


?>
0

$_SESSION['id'] = $wiersz['id']; - przecież nie masz zainicjalizowanego $wiersz['id'] ; Więc nie zostaje nic przypisane do $id - więc do bazy wpada 0.
Musisz sobie pobrać id usera który wykonuje akcję wylogowania

0
<?php

	session_start();
	
	require_once "connect.php";

$polaczenie = new mysqli($host,$db_user,$db_password,$db_name);

if ($polaczenie->connect_errno!=0){
	echo "błąd serwera";
}	
else
{
$login = $_POST['login'];
$haslo = $_POST['haslo'];

$login = htmlentities($login, ENT_QUOTES, "UTF-8");
//$haslo = htmlentities($haslo, ENT_QUOTES, "UTF-8");

if ($rezultat = $polaczenie->query(sprintf("SELECT * FROM logowanie WHERE user='%s'",mysqli_real_escape_string($polaczenie,$login))))
{
	$ilu_userow = $rezultat->num_rows;
	if ($ilu_userow>0)
	{
		$wiersz = $rezultat->fetch_assoc();

		if (password_verify($haslo,$wiersz['pass'])) 
		{	
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['user'] = $wiersz['user'];
				$id = $wiersz['id'];
				$date = date('Y-m-d H:i:s');

	$query = $polaczenie->query("INSERT INTO historia (user_id,action_type,created_at) VALUES('$id','1','$date')");
}
}
}
}
	session_unset();

	header('Location: panel.php');


?>

Próbowałem tak ale teraz to mi nawet nie dodaje żadnego rekordu przy kliknieciu wyloguj się

0

Nie, nie. Usuń to. Zrób echo $_SESSION['id'] i napisz co wyświetliło.

0

Notice: Undefined variable: wiersz in C:\xamppp\htdocs\test\logout.php on line 14

Notice: Undefined variable: wiersz in C:\xamppp\htdocs\test\logout.php on line 15

Notice: Undefined variable: wiersz in C:\xamppp\htdocs\test\logout.php on line 16

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.