Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SESJE] Problem z logowaniem!
Forum PHP.pl > Forum > PHP
daggerinho
Witam mam problem, mam stworzony już formularz rejestracyjny, który zapisuje do bazy nick, haslo oraz email szyfrując za pomocą SHA1. Jendak mam pewien problem z logowaniem. O to skrypt.

  1. <?php
  2.  
  3. mysql_connect("localhost", "root", "krasnal")or die("Nie można nawiązać połączenia z bazą");
  4. mysql_select_db("jawychodze")or die("Wystąpił błąd podczas wybierania bazy danych");
  5.  
  6.  
  7.  
  8. if(isset($_SESSION['zalogowany'])) {
  9. echo "Witam, ".$_SESSION['login'];
  10. }else{
  11.  
  12. if(isset($_POST['zaloguj'])) {
  13.  
  14.  
  15. if(mysql_num_rows(mysql_query("SELECT u_name, u_password
  16. FROM users WHERE u_name = '".(SHA1($_POST['login']))."'
  17. && u_password = '".(SHA1($_POST['haslo']))."' ")) > 0) {
  18.  
  19.  
  20. if(mysql_num_rows(mysql_query("SELECT id FROM users
  21. WHERE login = '".(SHA1($_POST['login']))."'
  22. && haslo = '".(SHA1($_POST['haslo']))."' ")) > 0 ) {
  23.  
  24.  
  25. $_SESSION['zalogowany'] = true;
  26. $_SESSION['login'] = (SHA1($_POST['haslo']));
  27. $_SESSION['haslo'] = (SHA1($_POST['haslo']));
  28. echo "Jesteś zalogowany.";
  29.  
  30.  
  31. } else {
  32.  
  33. echo "Złe hasło, proszę spróbować ponownie";
  34. }
  35. } else {
  36. echo "Nie ma takiego użytkownika";
  37. }
  38. } else {
  39.  
  40. ?>


formularz
  1. <form action="login.php" method="post"> <p><a href="register.php">Zarejestruj się</a> bądź zaloguj Nazwa:<input type="text" name="login" maxlength="15"> Hasło:<input type="text" name="haslo" maxlength="8"><input type="submit" value="Zaloguj" name="zaloguj"></form>



Problem polega na tym, że nie wiem dokładnie co jest źle i czy nie pomyliłem czasem coś ze zmiennymi sesyjnymi bo wszystko wydaje mi się być okej, natomiast nie działa.


Pozdrawiam
andycole
Po zalogowaniu dodaj przekierowanie do poprzedniej strony:

  1. header('Location: '.$_SERVER['HTTP_REFERER']);


dodatkowo przypisujesz hasło do zmiennej sesyjnej z loginem:

  1. $_SESSION['login'] = (SHA1($_POST['haslo']));
  2. $_SESSION['haslo'] = (SHA1($_POST['haslo']));


Co do zapytań, zrobiłbym to tylko jednym - wyciągającym rekord o podanym loginie (rozumiem że jest unikalny?).

  1. $objRes = mysql_query("SELECT u_name, u_password FROM users WHERE u_name = '".(SHA1($_POST['login']))."' ");
  2. $arrUser = mysql_fetch_array($objRes);
  3. //jeżeli nie znaleziono żadnego rekordu
  4. if($arrUser === false){
  5. echo 'Nie ma takiego loginu';
  6. //jeżeli znaleziono sprawdzamy hasło
  7. }else{
  8. if($arr['u_password'] == SHA1($_POST['haslo'])){
  9. echo 'Zalogowano';
  10. //wszystkie operacje i przekierowanie
  11. }else{
  12. 'Błędne hasło';
  13. }
  14. }
lord2105
Cytat
dodatkowo przypisujesz hasło do zmiennej sesyjnej z loginem:


Teraz to powiedziałeś, po co przesyłać hasło w sesji? AMATORKA

@daggerinho Nie przesyłaj hasła w sesji tylko ewentualnie ID usera.

Do Twojego skryptu dołóż:

  1. session_register("zalogowany");//ustawiaj na 1 / 0
  2. session_register("user_id");


i jeszcze takiego:

  1. if (!$_SESSION['zalogowany']) {
  2. $_SESSION['user_id'] = 0;
  3. }
  4. if ($_GET['logout'] == 'yes') {
  5.  
  6. $_SESSION['zalogowany'] = 0;
  7. $_SESSION['user_id'] = 0;
  8. }


Link do wylogowanie: asd.pl/index.php?logout=yes

  1. $_SESSION['login'] = (SHA1($_POST['haslo']));


a później chcesz wyświetlić login i co? krzaki?

  1. echo "Witam, ".$_SESSION['login'];


Właśnie tutaj ^^

Nie używaj haszowania loginu, co on taki tajny?

Wszelkich zapytań do bazy dokonujesz na podstawie sesji $_SESSION['user_id']
andycole
Cytat(lord2105 @ 2.10.2010, 13:22:01 ) *
Teraz to powiedziałeś, po co przesyłać hasło w sesji? AMATORKA


Stwierdziłem tylko, że przypisuje hasło do pola hasło i do pola login snitch.gif Nie wnikając już w sens trzymania tego w sesji.
Faktycznie trzymanie hasła w sesji jest niepotrzebne, zmiennej "zalogowany" wg mnie również.

Wystarczy, że w sesji będziesz przetrzymywał zmienną $_SESSION['user_id'].

Sprawdzenie czy jestes zalogowany:

  1. function czyZalogowany(){
  2. if(intval($_SESSION['user_id']) === 0){
  3. return false;
  4. }else{
  5. return true;
  6. }
  7. }


Cytat
Nie używaj haszowania loginu, co on taki tajny?


Dokladnie, nie ma sensu hashowania loginu czy to w sesji czy w bazie. Hasło, jak najbardziej.
daggerinho
Dziękuje za pomoc. W każdym razie po waszych radach zmieniłem kod i wygląda on teraz tak:

  1.  
  2. <?php
  3. mysql_connect("localhost", "root", "krasnal")or die("Nie można nawiązać połączenia z bazą");
  4. mysql_select_db("jawychodze")or die("Wystąpił błąd podczas wybierania bazy danych");
  5. session_register("zalogowany");
  6. session_register("user_id");
  7.  
  8.  
  9. if (!$_SESSION['zalogowany'] = 1) {
  10. $_SESSION['user_id'] = 1;
  11. }
  12. else
  13. {
  14.  
  15. $objRes = mysql_query("SELECT u_name, u_password FROM users WHERE u_name = '".($_POST['login'])."' ");
  16.  
  17. $arrUser = mysql_fetch_array($objRes);
  18.  
  19.  
  20. if($arrUser === false){
  21.  
  22. echo 'Nie ma takiego loginu';
  23.  
  24. }else{
  25.  
  26. if($arrUser['u_password'] == SHA1($_POST['haslo'])){
  27.  
  28. echo 'Zalogowano';
  29.  
  30. }else{
  31.  
  32. echo 'Błędne hasło';
  33.  
  34. }
  35. }
  36.  
  37. if ($_GET['logout'] == 'yes') {
  38. $_SESSION['zalogowany'] = 0;
  39. $_SESSION['user_id'] = 0;
  40.  
  41. }
  42.  
  43. ?>


Nie wiem czemu, ale zwraca mi on błąd w ostatniej linijce, czyli w tej w której jest ?>. Jestem raczej początkujący więc możliwe, że źle zrozumiałem wasze rady, aczkolwiek na logike wydaje mi się, że wszystko tak powinno działać więc prawdopodobnie gdzieś jest składniowy błąd, którego szukam już z 30 minut.
Pozdrawiam
andycole
Zapomniałeś zamknąć klamrę instrukcji warunkowej } na samym końcu właśnie smile.gif
daggerinho
Okej dziękuje wam za pomoc, skończyłem! Wszystko działa tak jak należy i podpiąłem to także pod inne podstrony więc cel osiągnięty. Pozdrawiam. Temat do zamknięcia
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.