Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Skrypt logowania
Forum PHP.pl > Forum > Przedszkole
Kpt_Blood
Witam serdecznie wszystkich użytkowników forum. Chciałem prosić o pomoc w poniższym skrypcie. Otóż chodzi o to, że nie bardzo chce mi działać funkcja logowania. Wyskakuje mi wyjatek zawarty w lini 56. Dodam ze na pewno dobrze połączyłe się z baza danych(skrypt rejestracji mam juz gotowy;) ). Opisze ponizszy skrypt komentarzami to moze latwiej bedzie znalezc blad. Z gory dziekuje wszystkim za pomoc.

  1. <?php
  2.  
  3. require_once('connect_mysql.php'); //dolaczam plik z polaczeniem do bazy danych
  4.  
  5. $login=$_POST['nazwa'];//chyba komentarz zbedny;)
  6. $haslo=$_POST['haslo'];
  7.  
  8. //Funkcja logowania
  9. function logowanie($login, $haslo)
  10. {
  11. $polaczenie = connect_mysql();
  12. $db = $polaczenie->query("select login, haslo from username where nazwa='$login' and haslo=sha1('$haslo')");//wysylam zapytanie w ktorym odczytuje z bazy danych login i haslo, porownuje z ty
    mi wprowadzonymi
  13.  
  14. if (!$db)
  15. {
  16. throw new Exception('Logowanie nie powiodło się.');//w razie gdyby nie udalo sie ;)
  17. }
  18. if ($db->num_rows>0)//jesli uzytkownik takowy znajdzie sie w bazie danych to zawsze wartosc bedzie pow
    yzej 0, a wiec zwroci mi wartosc true;)
  19. {
  20. return true;
  21. }
  22. else 
  23. {
  24. throw new Exception('Logowanie nie powiodło się.');
  25.  
  26. }
  27. }
  28.  
  29. //funkcja sprawdza czy uzytkownik jest zalogowany
  30. function sprawdz_user()//ta funkcja jest uzyta na koncu;)
  31. {
  32. if (isset($_SESSION['uzytkownik']))//patrz dalsza czesc kodu, poniewaz tam tez zarejestrowalem uzytkownika sesji
  33. {
  34. echo 'Zalogowano jako '.stripslashes($_SESSION['uzytkownik']).'.';
  35. echo '
  36. ';
  37. }
  38. else
  39. {
  40.  echo 'Brak zalogowania.
  41. ';
  42.  echo '<a href="formularz.php">Przejdz zalogowac sie</a>';
  43.  exit;
  44. }
  45. }
  46.  
  47.  
  48. if ($login && $haslo)//no wlasnie wiec jesli jest login i haslo to:
  49. {
  50. try
  51. {
  52. logowanie($login, $haslo);
  53. $_SESSION['uzytkownik'] = $login;//dalsza czesc kodu to wlasnie tu
  54. }
  55. catch (Exception $e)
  56. {
  57. echo 'Należy być zalogowanym aby oglądać tę stronę.
  58. ';
  59. echo '<a href="formularz.php">Przejdz aby sie zalogowac</a>';
  60. }
  61. }
  62.  
  63. sprawdz_user();
  64. echo 'Witaj wiec na stronie;)';
  65.  
  66. ?>


Na moje oko zrobione jest poprawnie, jednak wyskakuje mi ten wyjatek ehh..
kaem
Jak używasz throw z jakimś parametrem (komunikatem) to w catch'u przydało by się go wyświetlić za pomocą ex->getMessage(). Będziesz wiedział wtedy, w którym miejscu wyrzuciło ci ten wyjątek i co nie działa.
legorek
Pokaż interfejs klasy, której obiektem jest $db. Na mój gust: $db->num_rows powinno być metodą: $db->num_rows()
Kpt_Blood
kaem zrobilem tak jak mowiles i wychodzi na to ze:

  1. <?php
  2. if ($db->num_rows>0)//jesli uzytkownik takowy znajdzie sie w bazie danych to zawsze wartosc bedzie pow
    yzej 0, a wiec zwroci mi wartosc true;)
  3. {
  4. return true;
  5. }
  6. else 
  7. {
  8. throw new Exception('Logowanie nie powiodło się.');
  9.  
  10. }
  11. ?>


(to jest od 19 lini kodu w tamtym poscie)

tutaj wywala ten wyjatek, nie zwraca wartosc wartosc true, tak jakby nie odnajdywalo uzytkownika. moze jakos zle kodowanie hasla odczytuje?


legorek w skrypcie rejestracji uzywam $db->num_rows do sprawdzania podczas rejestracji czy login nie jest juz zajety i wszystko ładnie smiga:>
oto wyrywkowa czesc kodu z tego skryptu:

  1. <?php
  2. $db = $polaczenie->query("select * from username where nazwa='$login'"); 
  3. if ($db->num_rows>0) 
  4. {
  5. throw new Exception('Nazwa użytkownika zajęta — proszę wrócić i wybrać inną.');
  6. }
  7. ?>


No i w catchu pozniej mam wlasnie obsluge tego wyjatku przez e->getMessage();
Jednak dla pewnosci sprobowalem i wyskoczyl blad:
Fatal error: Call to undefined method mysqli_result::num_rows()

Jednak dzięki Wam za odpowiedzi.

EDIT:
legorek a $db do tego skryptu to:
  1. <?php
  2. $db = $polaczenie->query("select * from username where nazwa='$login' and haslo=sha1('haslo')");
  3. ?>


I zauwazylem ciekawa rzecz a mianowicie jesli usunalem druga czesc czyli sprawdzania hasla w bazie danych to zalogowalo sie, wiec wina tu musi lezec po stronie odkodowania, wiec teraz pytanie, zakodowalem to przez sha1, jednak zeby teraz odczytac to z bazy danych to powinienem uzyc jakiejs innej metody? Bo teraz jak widac nie działa.
kaem
A może po prostu wpisujesz złe hasło rolleyes.gif
Acha i jeszcze pamiętaj, że po zakodowaniu hasło zajmuje wiele więcej miejsca. Chyba coś ponad 40 znaków. Czyli może utwrzyłeś za krótkie pole na hasło w bazie.
A to twoje zapytanie jest dobre:
  1. <?php
  2. [b]$db = $polaczenie->query("select login, haslo from username where nazwa='$login' and haslo=sha1('$haslo')");[/b]
  3. ?>

Tylko nie czaje czemu wybierasz z bazy kolumnę "login" a w warunku where używasz jakiejś kolumny "nazwa".
Kpt_Blood
kaem no i problem rozwiazany, chodzilo o to ze w bazie danych ustawilem haslo na 10 znakow, a faktycznie po zakodowaniu 6znakowego hasla jest 40;)
Z tym czego nie czaisz to tu na forum pozmienialem nazwy pol i zmiennych chociaz to pewnie i tak bezpieczniejsze nie bedzie tongue.gif zawsze staram sie byc przezorny;)
W kazdym badz razie dziekuje:) wszystko smiga mam nadzieje jak nalezy.
Pozdrawiam.
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.