Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ban usera
Forum PHP.pl > Forum > Przedszkole
Damalin
Witam, czy może mi ktoś sprawdzić dlaczego ten skrypt na sprawdzanie czy osoba jest zbanowana nie działa jak należy ? w bazie mam ban ustawiony na 0, a gdy jest 1 nie powinno zalogować użytkownika, a przenieść na podstrone ban.php. Oto kod:
  1. <?php
  2.  
  3. if($_SESSION['ban']= 1)
  4. {
  5. header('Location: ban.php');
  6. }
  7.  
  8. if((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
  9. {
  10. header('Location: index.php');
  11. exit();
  12. }
  13.  
  14.  
  15.  
  16. require_once "dane.php"; //Łączenie z bazą danych
  17.  
  18. $laczenie = @new mysqli($host, $db_user, $db_password, $db_name);
  19.  
  20.  
  21. if ($laczenie->connect_errno!=0)
  22. {
  23. echo "Błąd: ".$laczenie->connect_errno;
  24. }
  25. else
  26. {
  27. $login = $_POST['login'];
  28. $haslo = $_POST['haslo'];
  29.  
  30. $login = htmlentities($login, ENT_QUOTES, "UTF-8");
  31.  
  32.  
  33. /* sprawdzanie poprawności loginu i hasła wraz z weryfikacją */
  34. if ($rezultat = @$laczenie->query(
  35. sprintf("SELECT * FROM users WHERE login='%s' AND weryfikacja='1'",
  36. mysqli_real_escape_string($laczenie,$login))))
  37. {
  38.  
  39.  
  40. $ile_wynikow = $rezultat->num_rows;
  41. if($ile_wynikow>0)
  42. {
  43. $wiersz = $rezultat->fetch_assoc();
  44.  
  45.  
  46.  
  47. if(password_verify($haslo,$wiersz['haslo']))
  48. {
  49.  
  50. $_SESSION['zalogowany'] = true;
  51. $_SESSION['login'] = $wiersz['login'];
  52. $_SESSION['id'] = $wiersz['id'];
  53. $_SESSION['email'] = $wiersz['email'];
  54. $_SESSION['ranga'] = $wiersz['typ_konta'];
  55. $_SESSION['ban'] = $wiersz['ban'];
  56.  
  57.  
  58. unset($_SESSION['blad']);
  59. $rezultat->free();
  60. $_SESSION['zalogowany'] = '<span style="color:green">Udało Ci się zalogować poprawnie !</span>';
  61. $laczenie->query("UPDATE users SET online=1 WHERE login='$login'");
  62. header('Location: index.php');
  63. }
  64. else
  65. {
  66. $_SESSION['blad'] = '<span style="color:red">Nieprawidłowe dane lub Twoje konto jeszcze nie zostało zweryfikowane !</span>';
  67. header('Location: index.php');
  68. }
  69.  
  70. } else {
  71. $_SESSION['blad'] = '<span style="color:red">Nieprawidłowe dane lub Twoje konto jeszcze nie zostało zweryfikowane !</span>';
  72. header('Location: index.php');
  73. }
  74. }
  75. /*Sprawdzanie czy nie jesteś adminem*/
  76.  
  77. if ($rezultat = @$laczenie->query(
  78. sprintf("SELECT * FROM users WHERE login='%s' AND typ_konta='3'",
  79. mysqli_real_escape_string($laczenie,$login))))
  80. {
  81. $ile_wynikow = $rezultat->num_rows;
  82. if($ile_wynikow>0)
  83. {
  84. $wiersz = $rezultat->fetch_assoc();
  85.  
  86. if(password_verify($haslo,$wiersz['haslo']))
  87. {
  88.  
  89.  
  90. $_SESSION['zalogowany'] = true;
  91.  
  92. unset($_SESSION['blad']);
  93. $rezultat->free();
  94. header('Location: admin/index.php');
  95. }
  96. }
  97.  
  98.  
  99.  
  100. $laczenie->close();
  101. }
  102. }
  103.  
  104. ?>
trueblue
W którym miejscu przekierowujesz na ban.php?
Jaki tam jest warunek?
Damalin
Cytat(trueblue @ 27.11.2016, 14:26:56 ) *
W którym miejscu przekierowujesz na ban.php?
Jaki tam jest warunek?


  1. if($_SESSION['ban']= 1)
  2. {
  3. header('Location: ban.php');
  4. }
Spawnm
Daj exit; po header
trueblue
Cytat(Damalin @ 27.11.2016, 14:28:07 ) *
  1. if($_SESSION['ban']= 1)
  2. {
  3. header('Location: ban.php');
  4. }

Ja to widzę, Ty chyba błędu nie znalazłeś.
Damalin
Cytat(Spawnm @ 27.11.2016, 14:30:45 ) *
Daj exit; po header

Zrobiłem tak, przenosi mnie do ban.php tylko niezależnie od tego czy ta osoba jest zbanowana czy nie

Cytat(trueblue @ 27.11.2016, 14:37:38 ) *
Ja to widzę, Ty chyba błędu nie znalazłeś.

Niestety nie widzę, dopiero zaczynam swoją przygodę z PHP
viking
if($_SESSION['ban']=== 1)
Damalin
Cytat(viking @ 27.11.2016, 14:51:47 ) *
if($_SESSION['ban']=== 1)

Niestety to też nie pomogło , teraz nikogo nie banuje
viking
A co zawiera $wiersz['ban']?
nospor
@viking jesli cos to ban zawiera '1' a nie 1 wiec
nie === 1
a == 1
Damalin
Cytat(viking @ 27.11.2016, 15:35:31 ) *
A co zawiera $wiersz['ban']?

wartość 1 lub 0 z bazy 0 = brak bana, 1 = ban

Cytat(nospor @ 27.11.2016, 15:45:00 ) *
@viking jesli cos to ban zawiera '1' a nie 1 wiec
nie === 1
a == 1

== czy === to ten sam efekt = brak bana
viking
@nospor. Miał to sprawdzić sam smile.gif
Więc zrób var_dump($wiersz); i sprawdź co tam faktycznie jest.
nospor
NIech on tez sprawdzi co ma w sesji i czy w ogole cos ma wink.gif
Generalnie rozwizanie problemu to wpierw poprawna diagnoza czyli jeden wielki var_dump() na wszystkim co sie da.
viking
To po pierwsze widzisz że typ danych to string, po drugie ban nie został nadany więc jak warunek ma być spełniony?
Damalin
Cytat(viking @ 27.11.2016, 16:26:51 ) *
To po pierwsze widzisz że typ danych to string, po drugie ban nie został nadany więc jak warunek ma być spełniony?

Jak zmienić żeby nie był stringiem ?
Ban akurat na koncie "Dawid" nie jest nadany, ale na innym jest i może się normalnie logować
viking
Na początek to musisz zrozumieć różnicę między = == i ===. A później sprawdź co jest w sesji (po session_start).
Damalin
Cytat(viking @ 27.11.2016, 16:37:36 ) *
Na początek to musisz zrozumieć różnicę między = == i ===. A później sprawdź co jest w sesji (po session_start).

Fakt, miałem tylko jedno =, a powinienem mieć 2 żeby zadziałało gdy wartość w bazie będzie taka sama czyli równa 1, ale mimo to dalej można się logować

REFRESH ~~
Bardzo proszę o pomoc w rozwiązaniu problemu
viking
No to sprawdziłeś co masz w sesji?
viking
Jeśli to co wyżej wkleiłeś pochodzi z var_dump($_SESSION) to ja widzę ban => 0. No i zobacz #4. Swoją drogą trochę to słabe - dopóki user nie skasuje / nie wygasi sesji to nie będzie w stanie się zalogować.
Damalin
Cytat(viking @ 28.11.2016, 09:39:51 ) *
Jeśli to co wyżej wkleiłeś pochodzi z var_dump($_SESSION) to ja widzę ban => 0. No i zobacz #4. Swoją drogą trochę to słabe - dopóki user nie skasuje / nie wygasi sesji to nie będzie w stanie się zalogować.

Bo to akurat wkleiłem z konta gdzie nie ma bana, ale czy jest konto z banem 1 czy z banem 0 to tak czy inaczej może się zalogować
Byłbyś w stanie mi napisać tego bana po swojemu tak żeby działało ? byłbym wdzięczny
viking
No to nie wklejaj losowych danych tylko konta które powinno mieć założonego bana. Może masz stare dane w sesji? Skąd to mamy wiedzieć? Pokaż teraz kod po zmianach.
Damalin
Cytat(viking @ 28.11.2016, 09:53:39 ) *
No to nie wklejaj losowych danych tylko konta które powinno mieć założonego bana. Może masz stare dane w sesji? Skąd to mamy wiedzieć? Pokaż teraz kod po zmianach.

  1. <?php
  2.  
  3. if($_SESSION['ban'] == 1)
  4. {
  5. header('Location: ban.php');
  6. exit();
  7. }
  8.  
  9. if((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
  10. {
  11. header('Location: index.php');
  12. exit();
  13. }
  14.  
  15.  
  16.  
  17. require_once "dane.php"; //Łączenie z bazą danych
  18.  
  19. $laczenie = @new mysqli($host, $db_user, $db_password, $db_name);
  20.  
  21.  
  22. if ($laczenie->connect_errno!=0)
  23. {
  24. echo "Błąd: ".$laczenie->connect_errno;
  25. }
  26. else
  27. {
  28. $login = $_POST['login'];
  29. $haslo = $_POST['haslo'];
  30.  
  31. $login = htmlentities($login, ENT_QUOTES, "UTF-8");
  32.  
  33.  
  34. /* sprawdzanie poprawności loginu i hasła wraz z weryfikacją */
  35. if ($rezultat = @$laczenie->query(
  36. sprintf("SELECT * FROM users WHERE login='%s' AND weryfikacja='1'",
  37. mysqli_real_escape_string($laczenie,$login))))
  38. {
  39.  
  40.  
  41. $ile_wynikow = $rezultat->num_rows;
  42. if($ile_wynikow>0)
  43. {
  44. $wiersz = $rezultat->fetch_assoc();
  45.  
  46.  
  47.  
  48. if(password_verify($haslo,$wiersz['haslo']))
  49. {
  50.  
  51. $_SESSION['zalogowany'] = true;
  52. $_SESSION['login'] = $wiersz['login'];
  53. $_SESSION['id'] = $wiersz['id'];
  54. $_SESSION['email'] = $wiersz['email'];
  55. $_SESSION['ranga'] = $wiersz['typ_konta'];
  56. $_SESSION['ban'] = $wiersz['ban'];
  57.  
  58. unset($_SESSION['blad']);
  59. $rezultat->free();
  60. $_SESSION['zalogowany'] = '<span style="color:green">Udało Ci się zalogować poprawnie !</span>';
  61. $laczenie->query("UPDATE users SET online=1 WHERE login='$login'");
  62. header('Location: index.php');
  63. }
  64. else
  65. {
  66. $_SESSION['blad'] = '<span style="color:red">Nieprawidłowe dane lub Twoje konto jeszcze nie zostało zweryfikowane !</span>';
  67. header('Location: index.php');
  68. }
  69.  
  70. } else {
  71. $_SESSION['blad'] = '<span style="color:red">Nieprawidłowe dane lub Twoje konto jeszcze nie zostało zweryfikowane !</span>';
  72. header('Location: index.php');
  73. }
  74. }
  75. /*Sprawdzanie czy nie jesteś adminem*/
  76.  
  77. if ($rezultat = @$laczenie->query(
  78. sprintf("SELECT * FROM users WHERE login='%s' AND typ_konta='3'",
  79. mysqli_real_escape_string($laczenie,$login))))
  80. {
  81. $ile_wynikow = $rezultat->num_rows;
  82. if($ile_wynikow>0)
  83. {
  84. $wiersz = $rezultat->fetch_assoc();
  85.  
  86. if(password_verify($haslo,$wiersz['haslo']))
  87. {
  88.  
  89.  
  90. $_SESSION['zalogowany'] = true;
  91.  
  92. unset($_SESSION['blad']);
  93. $rezultat->free();
  94. header('Location: admin/index.php');
  95. }
  96. }
  97.  
  98.  
  99.  
  100. $laczenie->close();
  101. }
  102. }
  103.  
  104. ?>
viking
Wywal jeszcze wszystkie @, włącz pełne raportowanie błędów. Jakby nie patrzeć działa:
  1. <?php
  2.  
  3. if($_SESSION['ban'] == 1)
  4. {
  5. header('Location: ban.php');
  6. exit();
  7. }
  8.  
  9. $_SESSION['ban'] = 1;
Damalin
Cytat(viking @ 28.11.2016, 10:28:30 ) *
Wywal jeszcze wszystkie @, włącz pełne raportowanie błędów. Jakby nie patrzeć działa:
  1. <?php
  2.  
  3. if($_SESSION['ban'] == 1)
  4. {
  5. header('Location: ban.php');
  6. exit();
  7. }
  8.  
  9. $_SESSION['ban'] = 1;

Zrobiłem tak, ale problem w tym że dalej mogę się normalnie zalogować
viking
Czyli co? Jak wklejasz tylko i wyłącznie ten kod wyżej to if nie działa? Czy ja czegoś już nie rozumiem?
Damalin
Cytat(viking @ 28.11.2016, 10:58:21 ) *
Czyli co? Jak wklejasz tylko i wyłącznie ten kod wyżej to if nie działa? Czy ja czegoś już nie rozumiem?

Tak wkleiłem tego ifa z banem i jak się loguje na stronie to niezależnie czy konto ma bana czy nie efekt jest ten sam - zaloguje się bez żadnego problemu
trueblue
O jakim dokładnie momencie logowanie piszesz? Przed wejściem do formularza logowania czy po zalogowaniu?
Ban ustawiasz po zalogowaniu, więc na pewno dotrzesz do formularza logowania i się zalogujesz. Banowanie następuje po zalogowaniu.
Zamiast podejmować próbę logowania użytkownika, powinieneś sprawdzić czy ma ban i wtedy od razu go przekierować na odpowiednią podstronę.
Damalin
Cytat(trueblue @ 28.11.2016, 11:08:28 ) *
O jakim dokładnie momencie logowanie piszesz? Przed wejściem do formularza logowania czy po zalogowaniu?
Ban ustawiasz po zalogowaniu, więc na pewno dotrzesz do formularza logowania i się zalogujesz. Banowanie następuje po zalogowaniu.
Zamiast podejmować próbę logowania użytkownika, powinieneś sprawdzić czy ma ban i wtedy od razu go przekierować na odpowiednią podstronę.

Sprawdzanie czy osoba jest zbanowana następuje na samej górze skryptu który nas loguje, a więc przed zalogowaniem
trueblue
A na jakieś podstawie skrypt wie, że użytkownik przed zalogowaniem jest zbanowany?
Damalin
Cytat(trueblue @ 28.11.2016, 11:21:10 ) *
A na jakieś podstawie skrypt wie, że użytkownik przed zalogowaniem jest zbanowany?

Dzięki wielkie ! Teraz działa, kwestia przestawienia kodu smile.gif
Jeszcze jest jeden mały błąd, kwestia przenoszenia gdy jest ban działa bez zarzutów, ale jak dam cofnij strone to jestem zalogowany normalnie
trueblue
Po pobraniu danych użytkownika, a przed zalogowaniem, sprawdzasz czy jest zbanowany.
Nie logujesz użytkownika zbanowanego. Zapis do sesji jest w tym przypadku niepotrzebny, no chyba, że nie chcesz takiego niezalogowanego i zbanowanego użytkownika kierować ponownie do formularza logowania.
Damalin
Cytat(trueblue @ 28.11.2016, 11:31:02 ) *
Po pobraniu danych użytkownika, a przed zalogowaniem, sprawdzasz czy jest zbanowany.
Nie logujesz użytkownika zbanowanego. Zapis do sesji jest w tym przypadku niepotrzebny, no chyba, że nie chcesz takiego niezalogowanego i zbanowanego użytkownika kierować ponownie do formularza logowania.


Czyli przed zalogowaniem i po zalogowaniu mam dodać
  1. if($_SESSION['ban'] == 1)
  2. {
  3. header('Location: ban.php');
  4. exit();
  5. }
  6.  
  7. $_SESSION['ban'] = 1;

? Bo to nie pomaga
trueblue
Przed password_verify sprawdzasz zawartość $wiersz['ban'].
Jeśli ma ban, kierujesz na ban.php, nie ma bana, puszczasz dalej.
Damalin
Cytat(trueblue @ 28.11.2016, 11:36:40 ) *
Przed password_verify sprawdzasz zawartość $wiersz['ban'].
Jeśli ma ban, kierujesz na ban.php, nie ma bana, puszczasz dalej.

Dzięki smile.gif działa
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.