$_SESSION nie pamięta danych sesyjnych

Witam, jestem w trakcie kursu php, próbuję zapisać to samo co prowadzący na filmie ale nie chce działać, byłoby super gdyby ktoś mógł coś podpowiedzieć :slight_smile: Przeglądarka wyświetla błędy:

Notice : Undefined variable: login in B:\xampp\htdocs\sklep\index.php on line 55

Notice : Undefined variable: login in B:\xampp\htdocs\sklep\index.php on line 65

mimo że mam poprzez ifa przypisanie podanego przez użytkownika loginu do $login i zapamiętanie sesji.

<?php session_start(); ?> Online-Shop
<br /><br />
<form action="index.php" method="post" enctype="multipart/form-data">
	
	Login: <br /><input type="text" name="login" value=""/> <br />
	Password: <br /><input type="password" name="password" value=""/> <br />
	<input type="submit" value="Log in" />
	
	
</form>

<?php
			
			if(isset($_GET['action']) && $_GET['action'] == "logged_out")
			{
				session_destroy();
				$_SESSION['logged_in'] = 0;
				
				echo "You are succesfully logged out";
			}

			if(isset($_POST['login']) && isset($_POST['password'])  || $_SESSION['logged_in'] == 1 )				
			{
				if(!empty($_POST['login']) || $_SESSION['logged_in'] == 1 )
				{
				
					if($_SESSION['logged_in'] == 0)
					{
					$login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);
					$password = Filter_var($_POST['password'], FILTER_SANITIZE_STRING);
					
			
					
					}
					
					if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1)
					{
						
						
						if($_SESSION['logged_in'] == 0)
						{
							$_SESSION['login'] = $login;
							
						}
						
						echo "logged on: ".$login;
						
						$_SESSION['logged_in'] = 1;
						
						
					}
					
					else
					{echo"Error. Try again <a href=' index.php '>HERE</a>";}		
				}
						
			}
			
			
			
				echo "<br /><a href = 'index.php'>Refresh</a> <br />";
				echo "<a href = 'index.php?action=logged_out'>Log out</a>";
		
		?>

Nie widzę sensu w dawaniu Ci odpowiedzi bo się niczego w taki sposób nie nauczysz. Generalnie jest kilka błędów logicznych w tym fragmencie kodu

					if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1)
					{
						
						
						if($_SESSION['logged_in'] == 0)
						{
							$_SESSION['login'] = $login;
							
						}
						
						echo "logged on: ".$login;
						
						$_SESSION['logged_in'] = 1;
						
						
					}

Popatrz na niego jeszcze raz i spróbuj dojść gdzie popełniłeś błąd. Kolejna kwestia, że błędy które wyświetla Ci php jednoznacznie sugerują z czym jest problem.

Programowanie to głównie myślenie, często kreatywne, a tego, żaden kurs ani szkolenie nie nauczy.

Jeszcze wrzuciłem to do IDE żeby lepiej na to zerknąć i wychodzi na to, że lekko wprowadziłem Cię w błąd. Masz źle popisane IFy - konkretnie masz bałagan z klamrami. Poniżej masz kod z ogarniętymi wcięciami, łatwiej będzie Ci znaleźć błąd

<?php session_start(); ?>

Online-Shop

<br /><br />
<form action="index.php" method="post" enctype="multipart/form-data">
	
	Login: <br /><input type="text" name="login" value=""/> <br />
	Password: <br /><input type="password" name="password" value=""/> <br />
	<input type="submit" value="Log in" />
</form>

<?php
	if(isset($_GET['action']) && $_GET['action'] == "logged_out")
	{
		session_destroy();
		$_SESSION['logged_in'] = 0;
		
		echo "You are succesfully logged out";
	}

	if(isset($_POST['login']) && isset($_POST['password'])  || $_SESSION['logged_in'] == 1 )				
	{
		if(!empty($_POST['login']) || $_SESSION['logged_in'] == 1 )
		{
		
			if($_SESSION['logged_in'] == 0)
			{
				$login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);
				$password = Filter_var($_POST['password'], FILTER_SANITIZE_STRING);
			}
			
			if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1)
			{
				if($_SESSION['logged_in'] == 0)
				{
					$_SESSION['login'] = $login;
				}
				
				echo "logged on: ".$login;
				
				$_SESSION['logged_in'] = 1;
			}
			else
			{
				echo"Error. Try again <a href=' index.php '>HERE</a>";
			}		
		}
				
	}

	echo "<br /><a href = 'index.php'>Refresh</a> <br />";
	echo "<a href = 'index.php?action=logged_out'>Log out</a>";
?>

nie widzę tutaj błędu, if przechodzi leżeli login i haslo się zgadzają lub jeżeli sesja zalogowanie równe 1, dalej jeżeli przeszło przez pierwszy if ze względu na zgodność log i pass to przypisz do zmiennej sesyjnej podany login, potem zmień sesję zalogowanie na 1, czyli po odświeżeniu powinien przejść tego ifa ze względu na to że sesja zalogowanie równe 1 pominąć drugiego ifa i wyświetlić że zalogował na to samo konto, a tego nie robi. Sam do tego nie dojdę, co wczoraj zmieniałem jedno to psuło się drugie, a błędu nie widzę

if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1)
				{
					
					
					if($_SESSION['logged_in'] == 0)
					{
						$_SESSION['login'] = $login;
						
					}
					
					echo "logged on: ".$login;
					
					$_SESSION['logged_in'] = 1;
					
					
				}

Dodaj krótki komentarz nad każdą (prawie) linijką do tego fragmentu kodu z informacją jak to według Ciebie działa

if(isset($_POST['login']) && isset($_POST['password'])  || $_SESSION['logged_in'] == 1 )				
{
	if(!empty($_POST['login']) || $_SESSION['logged_in'] == 1 )
	{
		if($_SESSION['logged_in'] == 0)
		{
			$login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);
			$password = Filter_var($_POST['password'], FILTER_SANITIZE_STRING);
		}
		
		if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1)
		{
			if($_SESSION['logged_in'] == 0)
			{
				$_SESSION['login'] = $login;
			}
			
			echo "logged on: ".$login;
			
			$_SESSION['logged_in'] = 1;
		}
		else
		{
			echo"Error. Try again <a href=' index.php '>HERE</a>";
		}		
	}
}

if(isset($_POST[‘login’]) && isset($_POST[‘password’]) || $_SESSION[‘logged_in’] == 1 ) //jeżeli jest ustawiony login i password lub sesja logged_in równa 1
{
if(!empty($_POST[‘login’]) || $_SESSION[‘logged_in’] == 1 ) // jeżeli login nie jest pusty lub sesja logged_in równa 1
{
if($_SESSION[‘logged_in’] == 0) //jeżeli sesja logged_in równa 0
{
$login = filter_var($_POST[‘login’], FILTER_SANITIZE_STRING); //zmienna login równa podany login w html
$password = Filter_var($_POST[‘password’], FILTER_SANITIZE_STRING); //zmienna password równa password podany w html
}

	if(($login == "abc" && $password == "cba") || $_SESSION['logged_in'] == 1) //jeżeli login równy abc i password równy cba lub sesja logged_in równa 1
	{
		if($_SESSION['logged_in'] == 0) // jeżeli sesja logged_in równa 0
		{
			$_SESSION['login'] = $login; //'login' w sesji równy podanemu loginowi w html
		}
		
		echo "logged on: ".$login; //wyświetl login
		
		$_SESSION['logged_in'] = 1; //sesja równa 1
	}
	else
	{
		echo"Error. Try again <a href=' index.php '>HERE</a>";
	}		
}

}

Musisz douczyć się o zakresie widoczności (zasięgu) zmiennych. Jeśli definujesz jakieś zmienne w jednym zakresie widoczności nie są one widoczne (dostępne) w innym. Przykład:

<?php
	$animal = 'owca'; // zmienna "globalna" dla pliku

	{	// jakiś nowy blok kodu - inny obszar widoczności zmiennych
		$fruit = 'truskawka';
		
		echo $animal;	// jest ok bo pochodzi z "wyższego poziomu" widoczności
		echo $fruit;	// jest ok bo jest to zmienna lokalna
	}

	{	// kolejny blok kodu - inny obszar widoczności zmiennych
		$color = 'czerwony';
		
		echo $animal;	// jest ok bo pochodzi z "wyższego poziomu" widoczności
		echo $fruit;	// NIE JEST OK bo pochodzi z innego obszaru widoczności
		echo $color;	// jest ok bo jest to zmienna lokalna
		
		{	// zagnieżdżony blok kodu - inny obszar widoczności zmiennych
			$status = 'zrobione';
			
			echo $animal;	// jest ok bo pochodzi z "wyższego poziomu" widoczności
			echo $fruit;	// NIE JEST OK bo pochodzi z innego obszaru widoczności
			echo $color;	// jest ok bo pochodzi z "wyższego poziomu"
			echo $status;	// jest ok bo jest to zmienna lokalna
		}
	}
	
	echo $animal;	// jest ok bo jest to zmienna lokalna
	echo $fruit;	// NIE JEST OK bo pochodzi z innego obszaru widoczności
	echo $color;	// NIE JEST OK bo pochodzi z innego obszaru widoczności
	echo $status;	// NIE JEST OK bo pochodzi z innego obszaru widoczności
?>

ok rozumiem. Dziwne tylko, że jest to praktycznie ten sam kod co na kursie (nazwy zmiennych tylko inne) i niby na filmie to działa. Jak rozumiem muszę inaczej ustawić klamry if’ów tak żeby brały pod uwagę odpowiednie zmienne? Dzięki za pomoc

Tak, jest to jedno z rozwiązań. Kursy są często nieaktualne, to to jest taka podstawa, że nie miała prawa zmienić się od powstania php.
Jeśli jest to kurs na yt to możesz podesłać link na pw to zerknę być może coś przeoczyłeś.

kurs jest stary, nie wiem dokładnie jak bardzo ale raczej starszy niż 5 lat, płatny ale poważnie przeceniony

Zobacz czy wyżej w kodzie nie jest zdefiniowane login i hasło jako globalne - w tedy kod ma sens.

PS. Moim zdaniem nie jest to warte 40 zł :confused:, w nieco wyższej cenie można znaleźć coś aktualniejszego i o niebo lepszego.