Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rejestracja i logowanie
huberthx
post 25.11.2019, 21:14:09
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 1.01.2016

Ostrzeżenie: (0%)
-----


Czy moglibyście zapoznać się z moim kodem rejestracji i logowania użytkowników.
Po ostatniej wpadce ze stronką chciałbym zasięgnąć opinii bardziej doświadczonych programistów, a że nie mam kogo się poradzić pisze dlatego na tym forum.
Oto kod:
  1. <?php
  2. class Uzytkownik
  3. {
  4. private $bazaDanych;
  5. //łączenie z bazą danych
  6. public function polaczZBazaDanych()
  7. {
  8. $this->bazaDanych = new mysqli('localhost','uzytkownik','haslo','bazaDanych');
  9. }
  10. //reozlaczenie z baza danych
  11. public function rozlaczZBazaDanych()
  12. {
  13. $this->bazaDanych->close();
  14. }
  15. //walidacja danych wprowadzonych przez użytkownika
  16. private function walidacja($dana)
  17. {
  18. //do uzupełnienia
  19. return $dana;
  20. }
  21. //rejestracja użytkownika
  22. public function zarejestrujUzytkownik($login,$email,$haslo1,$haslo2)
  23. {
  24. //łączenie z bazą danych
  25. $this->polaczZBazaDanych();
  26. //walidacja czterech zmiennych
  27. $login = $this->walidacja($login);
  28. $email = $this->walidacja($email);
  29. $haslo1 = $this->walidacja($haslo1);
  30. $haslo2 = $this->walidacja($haslo2);
  31. //zapytanie czy istnieje użytkownik o podanym loginie lub mailu
  32. $sqlSprawdzenieCzyIstniejeUzytkownikWBazieDanych = "SELECT * FROM uzytkownicy
  33. WHERE loginU = '".$login."' OR email = '".$email."'
  34. ";
  35. //wykonanie powyższego zapytania
  36. $rezultatSprawdzenia = $this->bazaDanych->query($sqlSprawdzenieCzyIstniejeUzytkownikWBazieDanych);
  37. //jezeli znaleziono użytkownika o takim samym loginie lub emailu
  38. if ($rezultatSprawdzenia->num_rows > 0)
  39. {
  40. echo "<span class='zle'>Użytkownik o takim samym loginie lub email-u instnieje, Rejesrtacja nie powiodła się</span>";
  41. return false;
  42. }
  43. else
  44. {
  45. //sprawdzenie czy hasła są identyczne
  46. if ($haslo1 != $haslo2)
  47. {
  48. //jeżeli nie są identyczne hasła odpowiedni komunikat
  49. echo "<span class='zle'>Hasła nie powtórzyły się</span>";
  50. return false;
  51. }
  52. //zapytanie - rejestracja użytkownika - zapisanie do bazy danych
  53. $sqlRejestracjaUzytkownik = "INSERT INTO uzytkownicy (loginU,email,haslo)
  54. VALUES ('".$login."','".$email."',SHA1('".$haslo1."'))";
  55. //wykonanie powyższego zapytania
  56. $rezultat = $this->bazaDanych->query($sqlRejestracjaUzytkownik);
  57. //jeżli rejestracja się powiodła odpowiedni komunikat
  58. if ($rezultat)
  59. echo "<span class='ok'>Zarejestrowano</span>";
  60. //jeżeli rejestracja się nie powiodła odpowiedni komunikat
  61. else
  62. echo "<span class='zle'>Rejestracja nie powiodła się</span>";
  63. }
  64. $this->rozlaczZBazaDanych();
  65. }
  66. //logowanie użytkownika
  67. public function zalogujUzytkownik($login,$haslo)
  68. {
  69. //walidacja
  70. $login = $this->walidacja($login);
  71. $haslo = $this->walidacja($haslo);
  72. //łączymy z bazą danych
  73. $this->polaczZBazaDanych();
  74. //zapytanie czy ligin i hasło się zgadzają
  75. $sqlLogowanie = "SELECT * FROM uzytkownicy WHERE
  76. loginU = '".$login."' AND haslo = SHA1('".$haslo."')";
  77. //wykonanie powyższego zapytania
  78. $rezultatLogowanie = $this->bazaDanych->query($sqlLogowanie);
  79. //jeżeli znaleziono dane o takim użytkowniku to logujemy
  80. if ($rezultatLogowanie->num_rows == 1)
  81. {
  82. $rezultatLogowanie = $rezultatLogowanie->fetch_assoc();
  83. //ustawienie sesji użytkownika - przechowuje login użytkownika
  84. $_SESSION['uzytkownik'] = $rezultatLogowanie['loginU'];
  85. //odpowiedzni komunikat po zalogowaniu
  86. echo "<span class='ok'>Zalogowano użytkownika ".$_SESSION['uzytkownik']." <a href='uzytkownik.php?akcja=wyloguj'>Wyloguj</a></span>";
  87. }
  88. else
  89. {
  90. //nie znaleziono użytkownika o takich danych - odpowiedni komunikat o tym fakcie
  91. echo "<span class='zle'>Nieudana próba logowania</span>";
  92. }//rozłączamyh z bazą danych
  93. $this->rozlaczZBazaDanych();
  94. }
  95. //wylogowywanie
  96. public function wyloguj()
  97. {
  98. //usuwanie zmiennej sesji
  99. unset($_SESSION['uzytkownik']);
  100. //odpowiedni komunikat informujący o wylogowaniu
  101. echo "<span class='ok'>Wylogowano</span>";
  102. }
  103. //pokazujemy info o zalogowanym użytkowniku lub o braku zalogowania
  104. public function czyZalogowano()
  105. {
  106. //w zależności o istnieniu sesji użytkownika odpowiednia informacja
  107. if (isset($_SESSION['uzytkownik']))
  108. echo "<span class='ok'>Zalogowano jako ".$_SESSION['uzytkownik']."<a href='uzytkownik.php?akcja=wyloguj' >Wyloguj</a></a></span>";
  109. else
  110. echo "<span><a href='uzytkownik.php?akcja=zalogujFormularz'>Nie jesteś zalogowany - zaloguj się</a></span>";
  111. }
  112. }
  113. ?>
  114.  

Za ocenę dziękuję

Ten post edytował huberthx 25.11.2019, 21:16:51
Go to the top of the page
+Quote Post
viking
post 26.11.2019, 08:00:22
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Popełniasz standardowy błąd początkujących. Opakowałeś strukturalny kod w klasę która niewiele ma wspólnego z programowanie obiektowym. Odpowiedzialność klasy: połączenie z bazą (fatalne jak już ci pisałem wcześniej), walidacja danych, funkcje widoku (echo kodu html), zarządzanie sesją. Poza tym mamy już czasy PHP7 - gdzie jakieś typowanie? Na początek poczytaj o dependency injection, PSR. Możesz to zrobić np:

  1. class UserEntity {
  2. use ArrayTrait; // metoda toArray()
  3.  
  4. private $login;
  5. private $email;
  6.  
  7. public function getLogin() : string {
  8. return $this->login;
  9. }
  10.  
  11. public function setLogin(string $login) : void {
  12. // Niektórzy tutaj dają walidację danych chociaż nie jestem zwolennikiem
  13. $this->login = $login;
  14. }
  15. }
  16.  
  17. class UserService implements UserServiceInterface {
  18.  
  19. private $storage;
  20.  
  21. public function __construct(\Pdo $storage) {
  22. $this->storage = $storage;
  23. }
  24.  
  25. public function registerUser(UserEntity $user) : bool {
  26. $this->storage->beginTransaction();
  27. try {
  28. $prep = $this->storage->prepare('INSERT INTO users...');
  29. $prep->execute($user->toArray());
  30. $this->storage->commit();
  31. return true;
  32. } catch (\PDOException $e) {
  33. // np. logowanie zdarzenia
  34. $this->storage->rollBack();
  35. return false;
  36. }
  37. }
  38. }


--------------------
Go to the top of the page
+Quote Post
huberthx
post 26.11.2019, 10:49:41
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 1.01.2016

Ostrzeżenie: (0%)
-----


Przepraszam że nie zakładam nowego tematu ale może w tym może być.
Czy mógłby ktoś polecić jakąś dobrą książkę o OOP-ie ?
Go to the top of the page
+Quote Post
gitbejbe
post 28.11.2019, 19:06:39
Post #4





Grupa: Zarejestrowani
Postów: 515
Pomógł: 63
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


książka niewiele Ci da. Podobnie jakbyś wpisał w google "php oop" to poczytasz o strukturze klas, ewentualnie jakieś proste przykłady w dupy. Cała sztuka nie polega na tym że napiszesz Class zamiast function, tylko na zmianie w sposobie myślenia o projektowaniu kodu oraz wykorzystaniu możliwości jakie dają Tobie obiekty. Tutaj trzeba sporego doświadczenia. Na początek na pewno poczytaj o dobrych praktykach (zacznij od SOLID) i staraj sie do nich stosować. W realizacji tych praktyk pomogą Tobie wzorce projektowe (przykładowy spis: https://lukasz-socha.pl/php/wzorce-projektowe-spis-tresci/). W pewnym momencie pomyślisz o testach jednostkowych i znowu odkryjesz że Twój kod powinien wyglądać jeszcze inaczej. Wypadałoby poznac standardy kodowania (PSR). Buszuj po githubie, analizuj kody innych, zacznij korzystać z frameworków. Tak jak wspomniałem wszystko to wymaga lat praktyki, stąd też stawki jakie zarabiają starsi programiści.

ps: pamiętaj przy tym że programowanie obiektowe to tylko jeden ze sposób na rozwiązanie danego zagadnienia, nie jest wcale powiedziane że takie podejście jest zawsze właściwe a nawet pożądane

Ten post edytował gitbejbe 28.11.2019, 19:08:21
Go to the top of the page
+Quote Post
Tomplus
post 28.11.2019, 19:38:46
Post #5





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Dokładnie @gitbejbe ma rację przykłady z książek zwykle nie są życiowe, ale nie oznacza to że książka się nie przyda, teraz na HELION jest promocja 2 książki w cenie 1, więc warto np. wziąć książkę o Czystym Kodzie, RC Martin. Możesz wziąć drugą o PHP o wzorcach i obiektach, przynajmniej zakodujesz sobie podstawy, łatwiej zrozumieć także Githuba, dlaczego ludzie piszą tak a nie inaczej.



Go to the top of the page
+Quote Post
huberthx
post 29.11.2019, 18:25:17
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 1.01.2016

Ostrzeżenie: (0%)
-----


Poczytałem i oto wynik mojej nauki i prośba o ocenę.
Przepraszam za być może nieodpowiednie nazewnictwo metod bądź składowych
Oto zarys kodu:
  1. <?php
  2.  
  3. class Db
  4. {
  5. private static $instance;
  6. private $host = 'localhost';
  7. private $username = 'uzytkownik';
  8. private $password = 'haslo';
  9. private $database = 'bazaDanych';
  10. private $connection;
  11. public static function getInstance()
  12. {
  13. if (self::$instance === null)
  14. {
  15. self::$instance = new Db();
  16. }
  17. return self::$instance;
  18. }
  19. private function __construct()
  20. {
  21. $this->connection = new mysqli($this->host,$this->username,$this->password,$this->database);
  22. }
  23. private function __clone() {}
  24. public function getConnection()
  25. {
  26. return $this->connection;
  27. }
  28. }
  29. $Db = Db::getInstance();
  30.  
  31. class Uzytkownik
  32. {
  33. private $login;
  34. private $haslo;
  35. public function setLogin($login) : void
  36. {
  37.  
  38. $this->login = $login;
  39. }
  40. public function getLogin() : String
  41. {
  42. return $this->login;
  43. }
  44. public function setHaslo($haslo) : void
  45. {
  46. $this->haslo = $haslo;
  47. }
  48. public function getHaslo() : String
  49. {
  50. return $this->haslo;
  51. }
  52. private $db;
  53. public function bazaDanych($db)
  54. {
  55. $this->db = $db;
  56. return $this->db;
  57. }
  58. public function rejestracja($login,$haslo)
  59. {
  60. $this->setLogin($login);
  61. $this->setHaslo($haslo);
  62. $login = $this->getLogin();
  63. $haslo = $this->getHaslo();
  64. $this->db->query(/*ZAPYTANIE INSERT*/);
  65. }
  66. }
  67.  
  68. $Uzytkownik = new Uzytkownik();
  69. $Uzytkownik->bazaDanych($Db->getConnection());
  70. $Uzytkownik->rejestracja('login','haslo');
  71.  
Go to the top of the page
+Quote Post
viking
post 29.11.2019, 19:36:46
Post #7





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Podstawowe pytanie - po co ci ten singleton? Kod ogólnie dalej fatalny.


--------------------
Go to the top of the page
+Quote Post
huberthx
post 29.11.2019, 20:01:54
Post #8





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 1.01.2016

Ostrzeżenie: (0%)
-----


Pomijając ten singleton - co ogólnie znowu zepsułem ?
Go to the top of the page
+Quote Post
nospor
post 30.11.2019, 09:57:42
Post #9





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




np to

  1. $this->setLogin($login);
  2. $this->setHaslo($haslo);
  3. $login = $this->getLogin();
  4. $haslo = $this->getHaslo();
  5. $this->db->query(/*ZAPYTANIE INSERT*/);

Jaki tu sens w tym kodzie?
Na dzien dobry masz zmienne $login i haslo, potem te zmienne ustawiasz set.... a potem je pobierasz get... i w rezultacie masz to co miales
O te 4 linijki
  1. $this->setLogin($login);
  2. $this->setHaslo($haslo);
  3. $login = $this->getLogin();
  4. $haslo = $this->getHaslo();

Mozna wywalic bo nic nie wnosza do tej funkcji


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
huberthx
post 30.11.2019, 10:58:42
Post #10





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 1.01.2016

Ostrzeżenie: (0%)
-----


Szczerze ja myślałem o tym żeby w metodach set była walidacja danych.
Przepraszam za to że nie podałem tego w kodzie - moje niedopatrzenie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 14:54