Problem ze stroną tylko dla zalogowanych

0

Mam problem ze stroną która ma być dostępna tylko dla zalogowanych użytkowników mianowicie strona nie sprawdza czy jest się zalogowanym tylko od razu przenosi do strony docelowej zamiast to strony logowania.

logowanie.php

<head>
<link rel="stylesheet" type="text/css" href="loginstyle2.css">
</head>
<body>
<div id="panellogowania">
<form method="POST" action="logowanie.php">
	<b>Login:</b> 
	<input type="text" id="login" name="login" required> <br><br>
	<b>Haslo:</b> 
	<input type="password" id="haslo" name="haslo" required> <br><br>
	<input type="submit" value="Zaloguj" name="loguj">
</form>
</div>
</body>

<?php
	$servername = "localhost";
	$user = "root";
	$pass = "";
	$dbname = 'db101';
	$link = mysqli_connect($servername, $user, $pass, $dbname);
	date_default_timezone_set('Europe/Warsaw');
	session_start();
	
	if($link) 
	{
		echo "Nawiązano Połączenie Z Bazą Danych";
	}
	else {
		echo "Nie nawiązania Połączenia Z Bazą Danych";
	}
	
	if (isset($_POST['loguj']))
	{
		$login = ($_POST['login']);
		$haslo = ($_POST['haslo']);
		$ip = ($_SERVER['REMOTE_ADDR']);
//		echo "SELECT login, haslo FROM uzytkownicy WHERE login = '".$login."' AND haslo = '".$haslo."' ORDER BY punkty DESC";
		
		if (mysqli_num_rows(mysqli_query($link, "SELECT login, haslo FROM uzytkownicy WHERE login = '".$login."' AND haslo = '".$haslo."'")) > 0)
		{
			mysqli_query($link, "UPDATE uzytkownicy SET logowanie = '".date('Y-m-d H:m:s')."', `ip` = '".$ip."' WHERE login = '".$login."'");
			
			session_start();
			$_SESSION['zalogowany'] = true;
			$_SESSION['login'] = $login;
			
			
			header('Location: index.php');
		}
		else {
			
			
			if($_SESSION['haslo'] != $haslo  OR $_SESSION['login'] != $login)
			{
				echo "Niepoprawny login lub haslo!";
			}
			
			
		}
	}
?>

Sprawdzanie (index.php):

<?php
	$servername = "localhost";
	$user = "root";
	$pass = "";
	$dbname = 'db101';
	$link = mysqli_connect($servername, $user, $pass, $dbname);
	
	require "logowanie.php";
	
	if(isset($_SESSION["zalogowany"]) AND $_SESSION["zalogowany"] === true)
	{
		
		header("Location: index.html");
	}
	else{
		header("Location: logowanie.php");
	}



?>


Strona docelowa (index.html):

<?php
	$servername = "localhost";
	$user = "root";
	$pass = "";
	$dbname = 'db101';
	$link = mysqli_connect($servername, $user, $pass, $dbname);
	
	
	require 'index.php';
	
?>

<!DOCTYPE html>
<html>


<head>
	<title>Forum</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>

<h1>
	<h1>Forum</h1>
</h1>

<body>
	
	<ul>
		<li><a href="index.html">Strona Glowna</a></li>
		<li><a href="rankingpvp.php">Rankingi</a></li>
		<li><a href="profile.php">Profile</a></li>
		<li><a href="kontakt.html">Kontakt</a></li>
		<li2><a href="wyloguj.php">Wyloguj</a></li2>
	</ul>
	


	
</body>

</html>

3

session_start() musi być na początku, przed HTMLem.
Przeczytaj: https://www.w3schools.com/php/php_sessions.asp
Bo tak powinieneś mieć błąd z informacją, że nagłówki zostały już wysłane.
Stronę chyba główną masz jako index.html a nie index.php czy PHP Ci tak działa, masz ustawione by .HTML było interpretowane przez PHP?
Przed tym logowaniem sprawdź co jest w sesji przez var_dump żebyś wiedział co tam się sprawdza.

0

Jak można ustawić to interpretowanie?

1

W zależności od użytego serwera. Ale lepiej zmień po prostu na index.php a w serwerze dodaj index.php jako domyślną stronę. W ggoglu wpisz coś w stylu : "Twój serwer add index.php as default document"

0

Zrobiłem jeszcze wcześniej coś takiego.

Wywaliłem tamten index.html i dodałem po prostu do .php

<?php
	
	$servername = "localhost";
	$user = "root";
	$pass = "";
	$dbname = 'db101';
	$link = mysqli_connect($servername, $user, $pass, $dbname);
	
	if(isset($_SESSION["zalogowany"]) AND $_SESSION["zalogowany"] == true)
	{
		
		echo "Zalogowany";
		
	} else{
		
		header ("Location: logowanie.php");

	}
	

	
?>

<html>


<head>
	<title>Forum</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>

<h1>
	<h1>Forum</h1>
</h1>

<body>
	
	<ul>
		<li><a href="index.html">Strona Glowna</a></li>
		<li><a href="rankingpvp.php">Rankingi</a></li>
		<li><a href="profile.php">Profile</a></li>
		<li><a href="kontakt.html">Kontakt</a></li>
		<li2><a href="wyloguj.php">Wyloguj</a></li2>
	</ul>
	


	
</body>

</html>

Tylko cały czas przenosi do logowanie.php

0

session_start();
Daj na samym początku kodu i nie powtarzaj już nigdzie więcej.

Tutaj dodaj jakieś echo i sprawdź, czy to się w ogóle wykonuje:

$_SESSION['zalogowany'] = true;
$_SESSION['login'] = $login;

Jeśli się wykonuje, odczytaj z sesji wartości, które tam właśnie zapisałeś i zobacz, czy się zapisały.

0

Dałem session_start(); na początek.
Wykonuje się i wyświetla wartości:

D:\Baza\www\logowanie.php
array (size=2)
'zalogowany' => boolean true
'login' => string 'admin' (length=5)

2

A na stronie, na której sprawdzasz stan zalogowania, masz session_start();?

0

Nie miałem dodałem teraz i wszystko działa. Dzięki za pomoc.

1

Sugeruję w ogólności napisać osobny moduł obsługi logowania, który to moduł będziesz następnie inkludować na początku każdej strony,

W module umieścić takie sekcje:

  • uruchomienie sesji, ew. też ustawienie czasu sesji,
  • odczyt danych z formularza,
  • jeśli przesłano poprawne dane, odczyt z bazy i zapisanie do sesji faktu zalogowania, nazwy użytkownika, jego poziomu dostępu itp,
  • jeśli przesłano polecenie wylogowania, wyczyszczenie powyższych danych z sesji.

Dzięki temu na każdej swojej stronie będziesz mieć informację o stanie zalogowanego użytkownika.

I sugeruję nie przechowywać haseł otwartym tekstem, tylko haszować je.

1 użytkowników online, w tym zalogowanych: 0, gości: 1