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ę:
if(http://www.php.net/isset($_POST['Zaloguj'])) { $login = $_POST['login']; $password = $_POST['password']; $logowanie = "SELECT * FROM logowanie WHERE login='$login' and password='$password'"; $result = mysqli_query($link,$logowanie); if($result) { $count = mysqli_num_rows($result); if($count==1) { $_SESSION['zalogowany'] = 'tak'; $_SESSION['login'] = $login; $_SESSION['role'] = $role; ////Rola użytkownika if($role == 0) { 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>'; $results = mysqli_query($link,"SELECT * FROM logowanie"); while($row = mysqli_fetch_array($results)) { http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Edytuj dane</a></p>'; } } ////Rola administratora else if($role == 1) { 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>'; $results = mysqli_query($link,"SELECT * FROM logowanie"); while($row = mysqli_fetch_array($results)) { http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Usuń użytkownika</a></p>'; } } } else { 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>'; } } else { http://www.php.net/echo '<p>Błąd logowania poziom.</p>'; } }
Druknij sobie:
http://www.php.net/print_r($_SESSION);
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?)
if($row['role']==0) { ustaw sesje dla usera }elseif($row['role']==1) { //Ustaw sesje dla admina }else{ //Tutaj mozesz dac echo ze wystapil blad badz od razu headera do ponownego zalogowania. Jesli http://www.php.net/header to mozesz przed nim ustawic jakas sesje np $_SESSION['err_role'] = 'Blad 2356'; i tylko ty wiesz co to za blad a on sam ma sie wyswietlic przy formularzu jak juz przekierujesz. } Teraz sprawdzasz warunkami co siedzi w sesji 'role' i wyswietlasz.
Zrobiłem jak poradziliście mi.
Nadal myli mi role - rzeczy dla admina wyświetla jak dla usera. Dla usera też jak dla usera.
http://www.php.net/print_r($_SESSION); $count = mysqli_num_rows($result); if($count==1) { $_SESSION['zalogowany'] = 'tak'; $_SESSION['login'] = $login; //<div>Udało się zalogować jako User | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div> if($row['role']==0) { http://www.php.net/echo 'Sesja dla usera'; http://www.php.net/echo 'Edycja'; http://www.php.net/echo '<br /><br />ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a><br />'; } else if($row['role']==1) { http://www.php.net/echo 'Sesja dla admina'; http://www.php.net/echo 'Usuń'; http://www.php.net/echo '<br /><br />ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a><br />'; } else { http://www.php.net/echo 'Błąd'; } }
Jaka nazwe w bazie ma kolumna na role
mam tabele logowanie, w niej tabela role (tinyINT).
TAK
Podajesz coś takiego:
$_SESSION['role'] = $role;
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
Brak deklaracji $role. Natomiast $row['role'] możesz użyć dopiero w pętli while
Czy zatem zmienna $role powinna być zadeklarowana w sesji [w strefie zastrzeżonej] czy przy przekazywaniu przez formularz logowania?
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.
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 -->
if($count==1) { $_SESSION['zalogowany'] = 'tak'; $_SESSION['login'] = $login; //<div>Udało się zalogować jako User | ZALOGOWANY: '.$_SESSION['login'].' <a href="logowanie.php?wyloguj='.$_SESSION['login'].'">Wyloguj</a></div> }
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
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?
if(http://www.php.net/isset($_POST['Zaloguj'])) { $login = mysqli_real_escape_string($link, $_POST['login']); $password = $_POST['password']; $logowanie = "SELECT * FROM logowanie WHERE login='$login' LIMIT 1"; //pole login unikalne $result = mysqli_query($link,$logowanie); if($result) { $row = mysqli_fetch_assoc($result); if($row && password_verify($password, $row['password'])) { $_SESSION['zalogowany'] = true; $_SESSION['login'] = $row['login']; $_SESSION['role'] = $row['role']; $_SESSION['id'] = $row['id']; //dodatkowo id żeby np łatwiej wybierać później z bazy 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ę. $results = mysqli_query($link,"SELECT * FROM logowanie"); while($row = mysqli_fetch_array($results)) { http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Edytuj dane</a></p>'; if ($_SESSION['role'] == 1 && ($row['id'] != $_SESSION['id'])) { // nie chcemy skasować własnego konta admina http://www.php.net/echo '<p>'.$row['login'].' - <a href="#">Usuń użytkownika</a></p>'; } } } else { 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>'; } } else { http://www.php.net/echo '<p>Błąd logowania poziom.</p>'; } }
Sprawdzam, sprawdzam i niestety nie działa. To znaczy - przekierowuj mnie od razu na błąd logowania.
I jest błąd w literówce:
--> brakuje nawiasu domykającego.
($_SESSION['role'] == 1) ? 'Admin' : 'User')
W sensie, aby na innej stronie podawać coś takiego:
if($_SESSION['zalogowany']='tak') { ... }
if($_SESSION['zalogowany']== true) z kodu wyżej. Zwracaj uwagę na = oraz ==/===
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:
if($_SESSION['zalogowany']=='true') { if($_GET['pokaz']) { $id = $_GET['pokaz']; $result = mysqli_query($link,"SELECT * FROM logowanie WHERE id='$id'"); $row = mysqli_fetch_assoc($result); http://www.php.net/echo '<p> - '.$row['id'].' - '.$row['login'].'</p>'; //Przekierowanie na stronę główną http://www.php.net/header('Refresh: 5; URL=index.php'); http://www.php.net/echo 'Zaraz zostaniesz przekierowany na stronę główną serwisu...'; } else { http://www.php.net/echo 'Błąd wyświetlenia danych'; } }
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ł.
Nie mam włączonego blokowania komunikatów o błędach a tutaj mi nic nie wywala, więc dalej nie wiem o co chodzi...
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
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'.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)