Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]problem z logowaniem różnch userów
Forum PHP.pl > Forum > Przedszkole
agata
Dzień dobry.

Mam problem z logowaniem użytkowników z różnymi rolami.

Napisałam coś takiego, gdy już user zostanie znaleziony w bazie to zależnie od roli jaką posiada powinien zostać przekierowany do swojego panelu i powinna zostać utworzona dla niego sesja. Nie wiem gdzie mam błąd i dlaczego tak a nie inaczej. Proszę o pomoc i wyjaśnienie jak powinnam to zrobić.

EDIT1:
Problem polega na tym że użytkownik nie zostaje przekierowany. User zostaje ponownie przekierowany do formularza gdzie dostaje komunikat o błędnych danych logowania


  1. <?php
  2. require_once('db_connect.php');
  3.  
  4.  
  5.  
  6. function login($login, $haslo)
  7. {
  8. $db_connect = new Db_connect();
  9.  
  10. $haslo=sha1($haslo);
  11. $zapytanie = "SELECT Login, Haslo FROM Users WHERE Login ='$login' and Haslo ='$haslo'";
  12. $wynik = mysql_query($zapytanie) or die (mysql_error('Nie można wykonać zapytania'));
  13.  
  14.  
  15.  
  16. $ile = mysql_num_rows();
  17.  
  18. if ( $ile > 0 )
  19. {
  20. $query = mysql_query ("Select Rola From Users Where Rola='$rola'") or die (mysql_error('nie mogę wyciągnąć roli użytkownika'));
  21. if ($rola == 'administrator')
  22. {
  23. header ('Location: admin/admin_control_panel.php');
  24. $_SESSION['rola'] = $rola;
  25. }
  26. else
  27. if ($rola == 'kierownik')
  28. {
  29. header ('Location: boss/boss_control_panel.php');
  30. $_SESSION['rola'] = $rola;
  31. }
  32. else
  33. if ($rola == 'pracownik')
  34. {
  35. header ('Location: workman/workman_control_panel.php');
  36. $_SESSION['rola'] = $rola;
  37. }
  38.  
  39. else
  40. {sleep(3);
  41. $blad="Podano błędne dane logowania";
  42. // kombinacja: identyfikator i hasło dostępu jest nieprawidłowa
  43. header('Location: index.php?blad=1');
  44. }
  45. }
  46. }
  47. ?>


Tutaj połączenie z bazą
  1. <?php
  2.  
  3. class Db_connect
  4. {
  5.  
  6. function __construct()
  7. {
  8. $host = 'localhost';
  9. $user = 'root';
  10. $password = 'xxx';
  11. $db = 'Sklep';
  12.  
  13. $this->db = mysql_connect($host, $user, $password, $db) or die (mysql_error('Nie mogę nawiązać połaczenia'));
  14. mysql_select_db($db, $this->db) or die (mysql_error('Nie mogę połaczyć z bazą danych'));
  15. mysql_query("Set Names 'utf8'");
  16. mysql_query("Set collation_connection = utf8_polish_ci");
  17.  
  18. }
  19.  
  20. public function closing ()
  21. {
  22. $close =$this->db;
  23. mysql_close($close);
  24. }?>


user wypełnia zwykły formularz
  1. <form action="" method="post" accept-charset="utf-8">
  2. <tr><td>Login</td><td><input type="text" class="text" name="login" /></td></tr>
  3. <tr><td>Hasło</td><td><input type="password" class="text" name="haslo" /></td></tr>
  4. <tr><td><input type="submit" value="Zaloguj"/></td></tr>
  5. <tr><td></td><td><?php
  6. if(isset($_GET['blad']))
  7. {echo "<font color=red>Podano błędne dane !</font>";}
  8. ?>
  9. </td></tr>
  10.  
  11. </table></form>
organista18
Rozwiń ten problem. Narazie napisałaś tylko, że masz problem, a nie napisałaś jaki. Czy wogóle samo logowanie Ci działa? Sam kiedyś z tym walczyłem, więc mogę Ci pomóc.
korro
mysql_affected_rows zawsze zwróci 0, ponieważ nie ma zastosowania z zapytaniem typu select.
zamiast:

zrób:
  1. $ile = mysql_num_rows($wynik);

Poza tym
  1. $query = mysql_query ("Select Rola From Users Where Rola='$rola'") or die (mysql_error('nie mogę wyciągnąć roli użytkownika'));

nigdzie w kodzie nie widzę zmiennej $rola, pewnie powinna być wyciągnięta z tabeli users.
No i to zapytanie
  1. SELECT Rola FROM Users WHERE Rola='$rola'

zwróci to, co podajesz jako parametr.
agata
Faktycznie nie ma zmiennej $rola i zapytanie też jest nieprawidłowe. Rozumiem gdzie są błedy i dlaczego jednak nie mogę dojść do tego jak poprawnie wyciągnąć rolę z bazy tak żeby zadziałało to z instrukcjami if else.
korro
Zamiast:
  1. $zapytanie = "SELECT Login, Haslo FROM Users WHERE Login ='$login' and Haslo ='$haslo'";
  2. $wynik = mysql_query($zapytanie) or die (mysql_error('Nie można wykonać zapytania'));
  3. $ile = mysql_num_rows();
  4. if ( $ile > 0 )
  5. {
  6. $query = mysql_query ("Select Rola From Users Where Rola='$rola'") or die (mysql_error('nie mogę wyciągnąć roli użytkownika'));

coś takiego, ale pisane z ręki, więc pewnie z błędami:
  1. $zapytanie = "SELECT rola FROM Users WHERE Login ='$login' and Haslo ='$haslo'";
  2. $wynik = mysql_query($zapytanie) or die (mysql_error('Nie można wykonać zapytania'));
  3. $rola = mysql_fetch_row($wynik);
  4. if ( isset($rola) )
  5. {
  6. $rola = $rola[0];

można to uprościć, ale powinno działać.
agata
Nadal występuje błąd w postaci ponownego przekierowania na stronę logowania z informacją o błędnych danych logowania.
Może mi ktoś to wytłumaczyć łopatologicznie sad.gif
darko
Pokaż swój kod po poprawkach korro
agata
witam.

Po walce udało mi się w końcu rozwiązać ten problem. Dzięki wszystkim za pomoc uwagi okazały się pomocne, chociaż zrobiłam to po swojemu.
To kod który działa poprawnie, jeśli jednak ktoś zauważy jakieś błędy lub lepsze rozwiązania proszę o uwagi.
  1. <?php
  2. require_once('db_connect.php');
  3.  
  4.  
  5.  
  6. function login($login, $haslo)
  7. {
  8. $db_connect = new Db_connect();
  9.  
  10. $haslo=sha1($haslo);
  11. $zapytanie = "SELECT Login, Haslo FROM Users WHERE Login ='$login' and Haslo ='$haslo'";
  12. $wynik = mysql_query($zapytanie) or die (mysql_error('Nie można wykonać zapytania'));
  13. $ile = mysql_fetch_row($wynik);
  14.  
  15. $zapytanie = "SELECT rola FROM Users WHERE Login ='$login' and Haslo ='$haslo'";
  16. $wynik = mysql_query($zapytanie) or die (mysql_error('Nie można wykonać zapytania'));
  17. $row = mysql_fetch_array($wynik);
  18.  
  19.  
  20. if ( $ile > 0 )
  21. {
  22. $_SESSION['rola'] = $row['rola'];
  23.  
  24. if ($_SESSION['rola'] == 'administrator')
  25. {
  26. header ('Location: admin/admin_control_panel.php');
  27.  
  28. }
  29. else
  30. if ($_SESSION['rola'] == 'kierownik')
  31. {
  32. header ('Location: boss/boss_control_panel.php');
  33.  
  34. }
  35. else
  36. if ($_SESSION['rola'] == 'pracownik')
  37. {
  38. header ('Location: workman/workman_control_panel.php');
  39.  
  40. }
  41.  
  42. else
  43. {sleep(3);
  44. $blad="Podano błędne dane logowania";
  45. // kombinacja: identyfikator i hasło dostępu jest nieprawidłowa
  46. header('Location: index.php?blad=1');
  47. }
  48. }
  49. }
  50. ?>


Jeszcze raz dziękuję za pomoc smile.gif
korro
Role, login i hasło możesz wyciągnąć z bazy za jednym razem. Zapytania są niemal identyczne.
Teraz nawet jeśli pierwsze zapytanie nic nie zwróci, wykonujesz drugie.

Edit:
w zasadzie, to login i hasło nie są potrzebne pobieraj tylko role.
piotrooo89
jak już ~korro napisał 2 razy zapytanie do db nie jest jakoś strasznie wymagane swobodnie można to na jednym zrobić. po za tym kod jest podatny na sql injection.
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.