Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MySQL][PHP]Problem przy zalogowanej osobie

Napisany przez: andrzejlechniak 11.08.2019, 17:09:57

Cześć,
Mam trochę nietypowy problem - chociaż nie wiem do końca, co jest NIE TAK - Coś nie działa.
Więc tak: serwis na pierwszy rzut oka działa OK - loguje się przez login i hasło..., chociaż nie rozpoznaje RÓL, reszta danych zapisanych w sesji działa, wyświetlając potrzebne dane.
ALE: gdy chcę odświeżyć stronę [np. przez F5 lub Enter w pasku adresu] bądź przejść z innej strony na tą, gdzie są dane zalogowanej osoby, wywala mi Pustą stronę lub formularz logowania.

Oto mój kod - wiem, że jest jeszcze nie dopracowany, ale przedstawiam go w takim stanie w jakim go sam testuję:

  1. if(http://www.php.net/isset($_POST['Zaloguj']))
  2. {
  3. $login = $_POST['login'];
  4. $password = $_POST['password'];
  5.  
  6. $logowanie = "SELECT * FROM logowanie WHERE login='$login' and password='$password'";
  7. $result = mysqli_query($link,$logowanie);
  8. if($result)
  9. {
  10. $count = mysqli_num_rows($result);
  11. if($count==1)
  12. {
  13. $_SESSION['zalogowany'] = 'tak';
  14. $_SESSION['login'] = $login;
  15. $_SESSION['role'] = $role;
  16.  
  17. ////Rola użytkownika
  18. if($role == 0)
  19. {
  20. http://www.php.net/echo '<div>Udało się zalogować jako User | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div>';
  21.  
  22. $results = mysqli_query($link,"SELECT * FROM logowanie");
  23. while($row = mysqli_fetch_array($results))
  24. {
  25. http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Edytuj dane</a></p>';
  26. }
  27. }
  28.  
  29. ////Rola administratora
  30. else if($role == 1)
  31. {
  32. http://www.php.net/echo '<div>Udało się zalogować jako Admin | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div>';
  33.  
  34. $results = mysqli_query($link,"SELECT * FROM logowanie");
  35. while($row = mysqli_fetch_array($results))
  36. {
  37. http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Usuń użytkownika</a></p>';
  38. }
  39. }
  40. }
  41. else
  42. {
  43. http://www.php.net/echo '<p>Nie udało się zalogować. Wróć do <a href="index.php">STRONY GŁÓWNEJ</a> aby się zalogować.</p>';
  44. }
  45. }
  46. else
  47. {
  48. http://www.php.net/echo '<p>Błąd logowania poziom.</p>';
  49. }
  50. }


Prośba o pomoc. A

Napisany przez: Tomplus 12.08.2019, 04:26:54

Druknij sobie:

  1. http://www.php.net/print_r($_SESSION);

Napisany przez: dublinka 12.08.2019, 06:23:49

Jesli masz dwie opcje 1 i 0 to musisz je przypisac do sesji w zaleznosci kto sie loguje. Czyli pobierasz dane z bazy (rozumiem ze $role trzymasz w bazie?)

  1. if($row['role']==0)
  2. {
  3. ustaw sesje dla usera
  4. }elseif($row['role']==1)
  5. {
  6. //Ustaw sesje dla admina
  7. }else{
  8. //Tutaj mozesz dac echo ze wystapil blad badz od razu headera do ponownego zalogowania.
  9. Jesli http://www.php.net/header to mozesz przed nim ustawic jakas sesje np $_SESSION['err_role'] = 'Blad 2356';
  10. i tylko ty wiesz co to za blad a on sam ma sie wyswietlic przy formularzu jak juz przekierujesz.
  11. }
  12.  
  13. Teraz sprawdzasz warunkami co siedzi w sesji 'role' i wyswietlasz.

Napisany przez: andrzejlechniak 12.08.2019, 07:17:54

Zrobiłem jak poradziliście mi.
Nadal myli mi role - rzeczy dla admina wyświetla jak dla usera. Dla usera też jak dla usera.

  1. http://www.php.net/print_r($_SESSION);
  2. $count = mysqli_num_rows($result);
  3. if($count==1)
  4. {
  5. $_SESSION['zalogowany'] = 'tak';
  6. $_SESSION['login'] = $login;
  7.  
  8. //<div>Udało się zalogować jako User | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div>
  9.  
  10. if($row['role']==0)
  11. {
  12. http://www.php.net/echo 'Sesja dla usera';
  13. http://www.php.net/echo 'Edycja';
  14. http://www.php.net/echo '<br /><br />ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a><br />';
  15. }
  16. else if($row['role']==1)
  17. {
  18. http://www.php.net/echo 'Sesja dla admina';
  19. http://www.php.net/echo 'Usuń';
  20. http://www.php.net/echo '<br /><br />ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a><br />';
  21. }
  22. else
  23. {
  24. http://www.php.net/echo 'Błąd';
  25. }
  26.  
  27. }


W mojej bazie danych mam ustawione 0 dla usera i 1 dla admina. I wciąż mi w skrypcie myli.

Napisany przez: dublinka 12.08.2019, 07:23:44

Jaka nazwe w bazie ma kolumna na role

Napisany przez: andrzejlechniak 12.08.2019, 07:30:36

mam tabele logowanie, w niej tabela role (tinyINT).

Napisany przez: dublinka 12.08.2019, 07:33:17

Cytat(andrzejlechniak @ 12.08.2019, 07:30:36 ) *
mam tabele logowanie, w niej tabela role (tinyINT).

Chodzi mi o nazwe kolumny gdzie sa 1 lub 0.
Nie nazwa tabeli
Edit
Ok rozumiem ze to jest nazwa 'role'

Napisany przez: andrzejlechniak 12.08.2019, 07:43:24

TAK

Napisany przez: viking 12.08.2019, 07:49:10

Podajesz coś takiego:

  1. $_SESSION['role'] = $role;

Skąd w tym kodzie bierze się zmienna $role?

Napisany przez: dublinka 12.08.2019, 07:49:52

Rejestrowac sesje masz w konkretnych warunkach.
If($row['role']==0)
{
$_SESSSION['rola'] = $row['role'];
}
elseif(...)
)else{
...
}
Teraz warunek do odczytu
If($_SESSSION['rola'] == 0)
{
echo 'zalogowany jako: admin';
}
If($_SESSSION['rola'] == 1)
{
echo 'zalogowany jako: USER';
}

pisze z tel nie mam dostepu do kompa teraz jsk cos to potem dpowiem

Napisany przez: dwadolary 12.08.2019, 07:55:31

Brak deklaracji $role. Natomiast $row['role'] możesz użyć dopiero w pętli while


Napisany przez: dublinka 12.08.2019, 08:09:26

Cytat(dwadolary @ 12.08.2019, 07:55:31 ) *
Brak deklaracji $role. Natomiast $row['role']

$role z kosmosu sie wzielo ale jiz to pomijam.
Jesli chodzi o tablice $row to domyslam sie ze autor o tym wie. Mam nadzieje.

Napisany przez: andrzejlechniak 12.08.2019, 08:29:12

Czy zatem zmienna $role powinna być zadeklarowana w sesji [w strefie zastrzeżonej] czy przy przekazywaniu przez formularz logowania?

Napisany przez: dublinka 12.08.2019, 08:34:24

Cytat(andrzejlechniak @ 12.08.2019, 08:29:12 ) *
Czy zatem zmienna $role powinna być zadeklarowana w sesji [w strefie zastrzeżonej] czy przy przekazywaniu przez formularz logowania?

Najpierw trzeba sobie zadac pytnaie czym jest ta zmienna bo Ty ja tam przypisujesz ale brak jest deklaracji (nie ma wartosci)

Napisany przez: viking 12.08.2019, 08:36:27

Rola powinna być odczytana z bazy i po poprawnym potwierdzeniu użytkownika dopisana do sesji. Dobrze jest stosowac enumeratory do takich rzeczy wtedy się nie zastanawiasz czy 0 to gość czy coś innego. Kolejna rzecz to dlaczego trzymasz hasło jako tekst? password_hash i password_verify.

Napisany przez: andrzejlechniak 12.08.2019, 08:54:16

Dobra.
1. Przesyłam przez formularz dane: login i hasło.
2. Odbieram dane --> jeśli są wpisane i zgodne, przechodzę do strefy dla zalogowanych. Tutaj w sesji przekazuję login i hasło. Jeśli przekazywane dane są złe, dostaję błąd.
3. Wszystkie dane są zapisane w bazie danych. Przy logowaniu pobieram dane: login i hasło. I gdzieś tu się gubię, bo nie wiem jak wyciągnąć role z bazy danych, tak aby JUŻ logując się użytkownik miał dostęp TYLKO do części portalu: dla Usera - np. edytuj dane; dla Admina - np. usunięcie Usera. Role mają dwie wartości: 0 [dla Usera] i 1 [dla Admina].
4. Gdzie przypisać dane - czy w formularzu przy logowaniu czy w miejscu, gdzie w sesji przekazuję dane z bazy -->

  1. if($count==1)
  2. {
  3. $_SESSION['zalogowany'] = 'tak';
  4. $_SESSION['login'] = $login;
  5.  
  6. //<div>Udało się zalogować jako User | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div>
  7. }

Napisany przez: dublinka 12.08.2019, 09:45:47

Przeciez juz napisalem wczesniej.

Odczytujesz dane i w konkretnych miejscach rejestrujesz sesje

Na razie jestem poza domem. Wroce to cos napisze. Bede za okolo 2-3h

Napisany przez: viking 12.08.2019, 10:09:47

2. Tutaj w sesji przekazuję login i hasło. - Po co chcesz zapisywać hasło w sesji? Nie jest do niczego potrzebne po zalogowaniu.
3. W jakiej postaci masz te role? relacja do innej tabeli czy samo pole roli?

  1. if(http://www.php.net/isset($_POST['Zaloguj']))
  2. {
  3. $login = mysqli_real_escape_string($link, $_POST['login']);
  4. $password = $_POST['password'];
  5.  
  6. $logowanie = "SELECT * FROM logowanie WHERE login='$login' LIMIT 1"; //pole login unikalne
  7. $result = mysqli_query($link,$logowanie);
  8. if($result)
  9. {
  10. $row = mysqli_fetch_assoc($result);
  11. if($row && password_verify($password, $row['password']))
  12. {
  13. $_SESSION['zalogowany'] = true;
  14. $_SESSION['login'] = $row['login'];
  15. $_SESSION['role'] = $row['role'];
  16. $_SESSION['id'] = $row['id']; //dodatkowo id żeby np łatwiej wybierać później z bazy
  17.  
  18. http://www.php.net/echo '<div>Udało się zalogować jako '. ($_SESSION['role'] == 1) ? 'Admin' : 'User') .'| ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div>'; //po co przekazujesz login do wyloguj? Wyloguj powinien zniszczysz bieżącą sesję.
  19.  
  20. $results = mysqli_query($link,"SELECT * FROM logowanie");
  21. while($row = mysqli_fetch_array($results))
  22. {
  23. http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Edytuj dane</a></p>';
  24. if ($_SESSION['role'] == 1 && ($row['id'] != $_SESSION['id'])) { // nie chcemy skasować własnego konta admina
  25. http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Usuń użytkownika</a></p>';
  26. }
  27.  
  28. }
  29. }
  30. else
  31. {
  32. http://www.php.net/echo '<p>Nie udało się zalogować. Wróć do <a href="index.php">STRONY GŁÓWNEJ</a> aby się zalogować.</p>';
  33. }
  34. }
  35. else
  36. {
  37. http://www.php.net/echo '<p>Błąd logowania poziom.</p>';
  38. }
  39. }
  40.  


Jakoś tak.

Napisany przez: andrzejlechniak 12.08.2019, 12:00:40

Sprawdzam, sprawdzam i niestety nie działa. To znaczy - przekierowuj mnie od razu na błąd logowania.
I jest błąd w literówce:

  1. ($_SESSION['role'] == 1) ? 'Admin' : 'User')
--> brakuje nawiasu domykającego.

Sprawdzam jeszcze, więc może sam tu czegoś nie wychwytuję...

----------------------
Posprawdzałem jeszcze raz, pozmieniałem parę drobnostek i działa.

Pozostaje to, o czym de facto pisałem na początku - odświeżanie strony. Czy można ten skrypt jakoś zabezpieczyć, aby odświeżając stronę trafiać na zablokowaną część?

Napisany przez: dublinka 12.08.2019, 14:42:01

Cytat(andrzejlechniak @ 12.08.2019, 12:00:40 ) *
Pozostaje to, o czym de facto pisałem na początku - odświeżanie strony. Czy można ten skrypt jakoś zabezpieczyć, aby odświeżając stronę trafiać na zablokowaną część?

Warunek.
Odpowiedni warunek w odpowiednim miejscu.

Napisany przez: andrzejlechniak 12.08.2019, 15:23:26

W sensie, aby na innej stronie podawać coś takiego:

  1. if($_SESSION['zalogowany']='tak')
  2. {
  3. ...
  4. }


Dobrze myśle, bo chyba czegoś brakuje

Napisany przez: viking 12.08.2019, 15:26:54

if($_SESSION['zalogowany']== true) z kodu wyżej. Zwracaj uwagę na = oraz ==/===

Napisany przez: andrzejlechniak 12.08.2019, 15:39:37

Dalej tak samo jest.

Powiem o co mi chodzi. Klikam w link <a href=...> ze strefy dla zalogowanych użytkowników - np. dodaję nowego użytkownika. Gdy wszystko jest ok - pokazuje mi komunikat że OK. w tym momencie też przesyłam informacje, że za chwilę zostanę przeniesiony do strony bazowej, ale gdy przenoszę się, to widzę pusty ekran z nagłówkiem be zawartości dla zablokowanych osób. O co tu chodzi?

Taki jest oto mój kod [Przykładowy - dla pokazania] w tym:

  1. if($_SESSION['zalogowany']=='true')
  2. {
  3. if($_GET['pokaz'])
  4. {
  5. $id = $_GET['pokaz'];
  6. $result = mysqli_query($link,"SELECT * FROM logowanie WHERE id='$id'");
  7. $row = mysqli_fetch_assoc($result);
  8. http://www.php.net/echo '<p> - '.$row['id'].' - '.$row['login'].'</p>';
  9.  
  10. //Przekierowanie na stronę główną
  11. http://www.php.net/header('Refresh: 5; URL=index.php');
  12. http://www.php.net/echo 'Zaraz zostaniesz przekierowany na stronę główną serwisu...';
  13. }
  14. else
  15. {
  16. http://www.php.net/echo 'Błąd wyświetlenia danych';
  17. }
  18. }

Napisany przez: viking 12.08.2019, 19:12:36

A od kiedy to można wysyłać nagłówki po treści? Gdybyś włączył raportowanie błędów to byś o tym wiedział.

Napisany przez: andrzejlechniak 12.08.2019, 19:16:29

Nie mam włączonego blokowania komunikatów o błędach a tutaj mi nic nie wywala, więc dalej nie wiem o co chodzi...

Napisany przez: dublinka 13.08.2019, 04:51:01

Cytat(andrzejlechniak @ 12.08.2019, 12:00:40 ) *
Pozostaje to, o czym de facto pisałem na początku - odświeżanie strony. Czy można ten skrypt jakoś zabezpieczyć, aby odświeżając stronę trafiać na zablokowaną część?

Ten plik logowania nie powinien wygladac tak jak wyglada. Tuz po zalogowaniu i zarejestrowaniu sesji powinno byc przekierowanie na dana strone (chocby index) Nie powinno sie wyswietlac niczego w takim pliku. On ma sluzyc tylko do zalogowania. Samo wyswietlenie kto jest zalogowany i jaka ma range juz w innych plikach. 'zabezpieczenie' o ktorym piszesz to jeden warunek na samym poczatku sprawadzajacy czy dana sesja istnieje (obojetnie ktora badz ustaw jakas dodatkową jeszcze) Jeśli istnieje od razu header() jesli nie skrypt leci dalej. Ot cale zabezpieczenie.

Napisany przez: andrzejlechniak 13.08.2019, 11:47:19

Trochę pomyślałem nad tym i faktycznie - sposób tutaj przedstawiony - chyba okazał się dość dobry. W każdym razie [na ten moment] poradziłem sobie z moimi problemami. Dziękuję wszystkim za pomoc smile.gif

Napisany przez: dublinka 13.08.2019, 12:05:24

Cytat(andrzejlechniak @ 13.08.2019, 11:47:19 ) *
Trochę pomyślałem nad tym i faktycznie - sposób tutaj przedstawiony - chyba okazał się dość dobry.

Sposób który został przedstawioany nawet dla nauki jest zły.
Ale rób jak chcesz....
whatever smile.gif

Napisany przez: andrzejlechniak 16.08.2019, 18:05:15

Trochę gubisz się w zeznaniach.
Skoro uważasz że to podane przez Ciebie rozwiązania są złe [i z Twoich słów wynika, że teraz tak myślisz a nie od początku] - to po co piszesz, że są złe?
Ktoś, nawet dla nauki, może stosować takie rozwiązania 'na poważnie'.

Napisany przez: dublinka 16.08.2019, 20:37:06

Cytat(andrzejlechniak @ 16.08.2019, 18:05:15 ) *
Trochę gubisz się w zeznaniach.
Skoro uważasz że to podane przez Ciebie rozwiązania są złe

Gdzie ja cos takiego napisalem ze moje rozwiazania ?

Napisales o przykladzie tutaj przedstawionym. Okresliles jego autora ?

Gdybys zacytowal moja odpowiedz ktora byla 'nad' Twoja i napisalbys to co napisales tj
"
Trochę pomyślałem nad tym i faktycznie - sposób tutaj przedstawiony - chyba okazał się dość dobry.

"
To nawet nie odpisywalbym.
Wiec trudno sie nie domyslec o co mi chodzilo. Najwyrazniej ktos tu ma problemy z logicznym mysleniem.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)