Panel Administratora - dostęp

Panel Administratora - dostęp
XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

Witam,

chciałem zrobić do stronki panel administratora. Utworzyłem w bazie danych kolumne user_rang, 0 - zwykły użytkownik, 1 - admin. Chciałbym, żeby przy logowaniu sprawdzało kto się loguje, jeśli loguje się admin, to żeby od razu go przerzucało do adminpanel.php, a jak zwykły użytkownik to index.php. Napisałem już coś, ale nie wiem gdzie leży błąd, nie działa.

plik login.php

Kopiuj

```<?php
session_start(); 

include('config.php');


if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore"); 
}


if (isset($_POST['signIn'])) {
if (empty($_POST['email']) || empty($_POST['password'])) {
echo "Wypełnij pola";
}
else
{

$email = $_POST['email'];
$password = $_POST['password'];
$ranga = $_POST['user_rang'];





include('config.php');




$sQuery = "SELECT id, password from account where email=? LIMIT 1"; 
$rQuery = "SELECT user_rang from account where user_rang=";


$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute(); //wykonanie
$stmt->bind_result($id, $hash); 
$stmt->store_result(); // zapisz wynik



$stmt = $conn->prepare($rQuery); 

if ($ranga == "1") { 
header("location: adminpanel.php");
 
}
 
else {
 
echo('Brak uprawnień');
 
}


if($stmt->fetch()) { 
  if (password_verify($password, $hash)) {
          $_SESSION['login_id'] = $id;

          if (isset($_SESSION['pageStore'])) {
            $pageStore = $_SESSION['pageStore'];
          }
          else {
            $pageStore = "index.php";
          }
          header("location: $pageStore"); 
          $stmt->close();
          $conn->close();

        }
else {
       echo 'Niepoprawny login lub hasło!';
     }
      } else {
       echo 'Niepoprawny login lub hasło!';
     }
$stmt->close();
$conn->close(); 
}
}
?>
pol90
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:1181
0

A dlaczego range przchowujesz w zmiennje $_POST

Kopiuj
$ranga = $_POST['user_rang'];

Nie lepiej w bazie jako odpowioednie pole i wtedy jak się loguje dany użytkownik to sprawdza czy dane pole nie jest 1 albo 0.

XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

W bazie jest ta kolumna user_rang, ale nie wiem jak to zapisać, żeby działało?
Coś takiego mam:

Kopiuj

```if ($ranga == "1") { 
header("location: adminpanel.php");

}

else {

echo('Brak uprawnień');

}
edytowany 2x, ostatnio: xyz_
pol90
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:1181
0
Kopiuj
<?php
session_start(); 

include('config.php');

if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore"); 
}

if (isset($_POST['signIn'])) {
if (empty($_POST['email']) || empty($_POST['password'])) {
echo "Wypełnij pola";
}
else
{

$email = $_POST['email'];
$password = $_POST['password'];
$ranga = $_POST['user_rang'];

include('config.php');

$sQuery = "SELECT id, password,user_rang from account where email= '$email' and ranga = '$ranga'"; 
$rQuery = "SELECT user_rang from account where user_rang=";

$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute(); //wykonanie
//$stmt->bind_result($id, $hash); 
//$stmt->store_result(); // zapisz wynik

//$stmt = $conn->prepare($rQuery); 
//tutaj musisz sam pokonbinowac jak to będzie wyglądało czy to jest poprawny zapis bo nigdy nie używałem tej biblioteki
if ($stmt->user_rang == "1") { 
header("location: adminpanel.php");

}

else {

echo('Brak uprawnień');

}

if($stmt->fetch()) { 
  if (password_verify($password, $hash)) {
          $_SESSION['login_id'] = $id;

          if (isset($_SESSION['pageStore'])) {
            $pageStore = $_SESSION['pageStore'];
          }
          else {
            $pageStore = "index.php";
          }
          header("location: $pageStore"); 
          $stmt->close();
          $conn->close();

        }
else {
       echo 'Niepoprawny login lub hasło!';
     }
      } else {
       echo 'Niepoprawny login lub hasło!';
     }
$stmt->close();
$conn->close(); 
}
}
?>
edytowany 1x, ostatnio: pol90
XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

Ogólnie jak zmieniłem na twoje to nie działa teraz w ogóle logowanie, bo wywala błąd tu:

  • $ranga = $_SESSION['user_rang'];
  • $stmt->bind_param("s", $email);
pol90
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:1181
0

No to weź odhaszuj te linijki mussiz sam pokombinowac bo ja z w tej bibliotece PDO nigdy nie robiłem.

Kopiuj
//$stmt->bind_result($id, $hash); 
//$stmt->store_result(); // zapisz wynik

//$stmt = $conn->prepare($rQuery); 
XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

Próbowałem z odhszowanymi i też to samo, ale dzięki za pomoc. Może ktoś jeszcze się wypowie?

edytowany 1x, ostatnio: xyz_
czysteskarpety
czysteskarpety
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
0

Jakby coś to tutaj masz sprawdzone rozwiązanie: https://github.com/delight-im/PHP-Auth


XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

Dzięki, ale wolałbym zostać przy swoim, bo bym musiał cały kod przerabiać.

ZD
w ogóle ta cala ranga istnieje w bazie ?
XY
Tak istnieje, zrobiłem ją typu int(1). 1-Admin, 0-zwykły user
ZD
domyslam sie ze trzymasz gdzies dane dla admina ?
XY
chodzi Ci o osobną strone dla admina? Tak, adminpanel.php, normalny user ma index.php
ZD
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:20
0

Troche masz tam haos.

Struktura tabeli: ID, password, user_rang, email

Kopiuj

<?php

session_start();


											function ReturnRow($ServerName, $UserName, $UserPassword, $DbName, $TableContent)
											{
												
												$Connection = mysqli_connect($ServerName, $UserName, $UserPassword);
						
												if(!$Connection)
												{
									
												die ('Nie można się polączyć z MySQL : ' . mysqli_connect_error());
														
												}
								
												$SelectDB = mysqli_select_db($Connection, $DbName);
						
												if(!$SelectDB)
									
												{
									
												print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();
							
												}
												
													$HasloZFormularza = "haslo";
													$LoginZFormularza = "emailuser@email.com";
													
										
													$sql = "SELECT id, password, user_rang, email FROM $TableContent WHERE password='$HasloZFormularza' AND email='$LoginZFormularza'";
													$result = mysqli_query($Connection,$sql);
													
													if (mysqli_num_rows($result) > 0) 
														{
															
															while($row = mysqli_fetch_assoc($result))
																{
																	
																	
																	if($row['user_rang'] == 1)
																	{
																		
																		$_SESSION['usr'] = '1';
																		header('location: adminpanel.php');
																		exit;
																		
																	} else {
																		
																		$_SESSION['usr'] = '0';
																		header('location: index.php');
																		exit;
																		
																	}
																	
																	
																}
																
																
													
														} else {
														
															print 'Brak danych spełniajacyc hte kryteria';
														
														}
												
												mysqli_close($Connection);
											}
											
										ReturnRow('localhost', 'root', 'pass', 'rangi', 'account');
// server, user, haslo, nazwa bazy, nazwa tabeli



?>

Teraz tylko sprawdzasz sesje na kazdej z tych stron

edytowany 1x, ostatnio: zdun
Zobacz pozostałe 2 komentarze
XY
Tak zmieniłem tam na dole na swoją bazę danych i usunąłem pass, bo nie ma żadnego. Ogólnie jak włączę stronę logowanie od razu w rogu wyskakuje "Brak danych spełniających te kryteria" nawet bez wpisywania czegokolwiek, a jak próbuje się zalogować nic nie wyświetla tylko dalej zostaje na tej stronie.
ZD
Linia 28 i 29 tam sa dane Twoje potrzebne do zalologowania. Teraz sa na sztywno. Zmien to na swoje z formularza. Tam jest tylko sprawdzenie hasla i emaila czy sa takie jak w bazie
XY
Dalej to samo. Ogólnie ten swój kod wkleiłem zamiast swojego, tak miało być?
ZD
sprawdz jakie masz nazwy w tabeli $sql = "SELECT id, password, user_rang, email FROM $TableContent WHERE password='$HasloZFormularza' AND email='$LoginZFormularza'"; Jesli masz informacje ze brak danych to haslo lub/i email roznią się
ZD
Zreszta pokaz co masz w tabeli jakie masz nazwy wierszy
XY
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:11
0

Tak wygląda tabela:
title

Tak wygląda register.php:

Kopiuj

```<?php
session_start();


if(isset($_SESSION['login_id'])){
  if (isset($_SESSION['pageStore'])) {
      $pageStore = $_SESSION['pageStore'];
header("location: $pageStore");
    }
}
 if (isset($_POST['signUp'])) {
if(!empty($_POST['fullName']) && !empty($_POST['email']) && !empty($_POST['newPassword']) && !empty($_POST['g-recaptcha-response'])){
$captcha = $_POST['g-recaptcha-response'];
$secretKey = "6LeVDJ4UAAAAAK1bx9E5VKOxNOnulyemW8l4Kfpi"; 
$ip = $_SERVER['REMOTE_ADDR']; //ip jest również wysyłane przez google
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha."&remoteip=".$ip); google'a
        $responseKeys = json_decode($response,true);	 
        if(intval($responseKeys["success"]) !== 1) { 
         
        } else {
      echo "Rejestracja zakończona sukcesem!";
        }
}
		
if (empty($_POST['fullName']) || empty($_POST['email']) || empty($_POST['newPassword']) || empty($_POST['g-recaptcha-response'] )) {
	$captcha = $_POST['g-recaptcha-response'];
echo "Proszę wypełnić wszystkie wymagane pola.";
}
else
{


        
		

		
		
		//if (empty($_POST['fullName']) || empty($_POST['email']) || empty($_POST['newPassword'] || empty($_POST['g-recaptcha-response']) )) {
$fullName = $_POST['fullName'];
$email = $_POST['email'];
$password = $_POST['newPassword'];
$hash = password_hash($password, PASSWORD_DEFAULT);


include('config.php');

$sQuery = "SELECT id from account where email=? LIMIT 1";
$iQuery = "INSERT Into account (fullName, email, password) values(?, ?, ?)"; 



if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $conn->prepare($sQuery);
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->bind_result($id);
$stmt->store_result();
$rnum = $stmt->num_rows;

if($rnum==0) { 
          $stmt->close();
          
          $stmt = $conn->prepare($iQuery);
    	  $stmt->bind_param("sss", $fullName, $email, $hash);
          if($stmt->execute()) {
			 
        //echo 'Rejestracja zakończona sukcesem!';
		}
        } else { 
       echo 'Ktoś już zarejestrował się na ten adres email.';
     }
$stmt->close();
$conn->close(); 
}
}
edytowany 1x, ostatnio: xyz_
ZD
No to widzisz ze haslo masz haszowane wiec jak moze to dzialac. Pokaz ten kawalek ktory odpowiedzialny jest za to w pliku gdzie dodajesz do bazy nowego usera
ZD
Ok a teraz powiedz mi w jaki sposob ustawiasz range
XY
Domyślnie jest ustawiona na 0 w bazie, a Adminowi zmieniłem ręcznie na 1 przez bazę danych.
ZD
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:20
0

Dodaj to tzn dodaj tylko te druga linijke

Kopiuj
$HasloZFormularza = "haslo"; // twoje haslo
$HasloZFormularza1 = password_hash($HasloZFormularza, PASSWORD_DEFAULT);
$EmailZFormularza = "emailuser@email.com"; // twoj email

i w zapytaniu zmien z $HasloZFormularza na $HasloZFormularza1

edytowany 1x, ostatnio: zdun
XY
Zrobiłem tak jak powiedziałeś, czyli zmieniłem ten wpis i wpisałem to hasło admin i mail admin@admin i jest tak samo jak wcześniej. Wyświetla się ten sam komunikat w rogu, że brak danych spełniających te kryteria od samego początku.
ZD
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:20
0

Troche trzeba zmienic bo to haszowanie bedziesz musial sprawdzac potem po zapytaniu. Sprawdz najpierw sam email:

Kopiuj

<?php


session_start();


											function ReturnRow($ServerName, $UserName, $UserPassword, $DbName, $TableContent)
											{
												
												$Connection = mysqli_connect($ServerName, $UserName, $UserPassword);
						
												if(!$Connection)
												{
									
												die ('Nie można się polączyć z MySQL : ' . mysqli_connect_error());
														
												}
								
												$SelectDB = mysqli_select_db($Connection, $DbName);
						
												if(!$SelectDB)
									
												{
									
												print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();
							
												}
												
													$HasloZFormularza = "hasloadmin";
													
													$EmailZFormularza = "emailadmin@email.com";
													
													
													$sql = "SELECT id, password, user_rang, email FROM $TableContent WHERE email='$EmailZFormularza'";
													$result = mysqli_query($Connection,$sql);
													
													if (mysqli_num_rows($result) > 0) 
														{
															
															while($row = mysqli_fetch_assoc($result))
																{
																	
															
																	if (password_verify($HasloZFormularza, $row['password'])) {
																		
																		if($row['user_rang'] == 1)
																	{
																		
																		$_SESSION['usr'] = '1';
																		header('location: adminpanel.php');
																		exit;
																		
																	} else {
																		
																		$_SESSION['usr'] = '0';
																		header('location: index.php');
																		exit;
																		
																	}
																		
																	} else {
																		
																		exit('bledne dane');
																		
																	}
																		
																		
																		
																	
																	
																	
																	
																	
																}
																
																
													
														} else {
														
															print 'Brak danych spełniajacyc hte kryteria';
														
														}
												
												mysqli_close($Connection);
											}
											
										ReturnRow('localhost', 'root', 'pwd', 'rangi', 'account');
										
										
										

?>
edytowany 1x, ostatnio: zdun
XY
Dalej to samo to musi być chyba jakiś inny błąd albo zły zapis gdzieś.
ZD
Jesli masz haslo zapisane tak jak pokazales i zmieniles dane w linijce 28 i 30 i dodajesz takie same dane do tabeli to musi dzialac. Dziala na 100%. Sprawdzone. Musisz gdzies popelniac blad.
ZD
Jesli podajesz adres email ze zmiennej $EmailZFormularza i taki sam jest w bazie to nie mozesz otrzymywac informacji print 'Brak danych spełniajacyc hte kryteria'; Sprawdz te zmienna; jaki jest adres wpisany i co jest w bazie w polu email. Chyba ze cos kombinujesz w inny sposob.
ZD
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:20
1
Kopiuj
$pass = password_hash('haslo', PASSWORD_DEFAULT);
$sql1 = "INSERT INTO account" . " (fullName, email, password, user_rang) VALUES ('User', 'php@gmail.com', '$pass', '0');

W tym momencie zmienna $pass zawiera string 'haslo' ktpore jest haszowane i zapisane do bazy i takie tez podajesz w zmiennej $EmailZFormularza (bez haszowania). Natomiast email: php@gmail.com podajesz w zmiennej $EmailZFormularza.

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.