Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ocena logowania OOP początkujący
mateuszstr1994
post 18.02.2018, 19:27:46
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 31.10.2014

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


Witam, jestem początkujący w programowaniu obiektowym, wcześniej pisałem w strukturalnym. Chciałbym aby ktoś bardziej profesjonalny ocenił kod logowania w OOP napisany przeze Mnie. Opinie innych są dla mnie bardzo ważna. Nie korzystam z żadnego wzorca projektowego, po prostu chce przepisać kod strukturalny na obiektowy aby lepiej go zrozumieć.

  1.  
  2. <?php
  3. class database{
  4. private $db_name = 'db_name';
  5. private $db_user = 'db_user';
  6. private $db_pass = 'db_pass';
  7. private $db_host = 'db_host';
  8. private $connect;
  9.  
  10. function __construct(){
  11. $this -> connect = new mysqli($this -> db_host,$this -> db_user,$this -> db_pass ,$this -> db_name);
  12. $this -> stan();
  13. $this ->kodowanie_zapytania();
  14. }
  15.  
  16. private function stan(){
  17. if($this -> connect -> connect_errno)
  18. throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');
  19. }
  20.  
  21. private function kodowanie_zapytania(){
  22. $wynik_zapytania=$this -> connect -> query ("SET NAMES 'utf8'");
  23. if(!$wynik_zapytania)
  24. throw new Exception('Ustawienie Kodowanie Zapytanie Nie Udało się');
  25. }
  26.  
  27. public function query($zapytanie){
  28. $zapytanie = $this -> connect -> query ($zapytanie);
  29. if(!$zapytanie)
  30. throw new Exception ('Wykonanie zapytania nie powiodło się');
  31. return $zapytanie;
  32. }
  33.  
  34. }
  35.  
  36.  
  37. class UserAuthorizer {
  38. private $connection;
  39.  
  40. function __construct(){
  41. $this -> connection = new database();
  42. }
  43.  
  44. public function logowanie($login, $password) {
  45. $wynik_zapytania = $this-> connection -> query("SELECT password FROM users where login='".$login."'");
  46.  
  47. if(!$wynik_zapytania->num_rows)
  48. throw new Exception('Podany uzytkownik nie istnieje '.$login);
  49.  
  50. $wiersz = $wynik_zapytania->fetch_assoc();
  51. if(!password_verify ($password,$wiersz['password']))
  52. throw new Exception("Hasła nie sa takie same");
  53. }
  54.  
  55.  
  56. }
  57.  
  58. try{
  59. $egzemplarz = new UserAuthorizer();
  60. $egzemplarz -> logowanie('login','haslo');
  61. }
  62. catch(Exception $e){
  63. echo $komunikat=$e->getMessage();
  64. }
  65. ?>
  66.  
Go to the top of the page
+Quote Post
markuz
post 18.02.2018, 19:36:52
Post #2





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


1. Używaj tylko angielskich nazw
2. Formatuj ładnie kod smile.gif (https://www.php-fig.org/psr/psr-2/)
3. Nie twórz klas które są "aliasami" innych klas - klasa database nic nie wnosi.
4. Nie twórz klas w konstruktorach tylko je "wstrzykuj" - czytaj o DI (to wzorzec, w OOP jest dużo wzorców bez nich OOP nie ma sensu na dłuższą mete).
5. Używaj PHP 7.2 (silne typowanie itp.)
6. Używaj phpunit/phpspec - naucz się pisać testy
7. Używaj namespace`ów i composera (https://www.php-fig.org/psr/psr-4/)

Ten post edytował markuz 18.02.2018, 19:38:11


--------------------
Go to the top of the page
+Quote Post
kapslokk
post 18.02.2018, 19:39:51
Post #3





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


1. Poczytaj o PSR
2. Koduj po angielsku smile.gif Nie wazne, ze teraz robisz to tylko dla siebie, jak wejdzie Ci w nawyk, to nie bedziesz sie musial przestawiac.
3. Nazwa klasy 'database' nie bardzo mi sie podoba. Raczej bym tutaj wstawil cos w stylu DatabaseConnection
4. Dane do polaczenia warto by bylo wyciagnac poza klase - zeby mozna jej bylo uzywac w wielu projektach / polaczeniach bez potrzeby zmian.
5. Zmienne do zapytan sie binduje, poczytaj o SQL Injection

To tak na szybko wink.gif
Go to the top of the page
+Quote Post
nospor
post 18.02.2018, 20:17:26
Post #4





Grupa: Moderatorzy
Postów: 36 429
Pomógł: 6289
Dołączył: 27.12.2004




Pozwol ze przeniose. Twoj problem z OOP nie ma zadnego zwiazku nachwile obecna

Cytat
Ustawienie Kodowanie Zapytanie Nie Udało się

A Co To Jest? Na Polskim Nie Uczyli Cie Jak SIe Pisze Zdania?

Poczytaj o DI. Klasa UserAuthorizer nie ma prawa tworzyc wewnatrz siebie obiektu bazy danych


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

"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
mateuszstr1994
post 18.02.2018, 20:26:49
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 31.10.2014

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


Dziękuje za pomoc, temat do zamknięcia smile.gif
Go to the top of the page
+Quote Post
kapslokk
post 18.02.2018, 20:31:31
Post #6





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Czemu do zamkniecia ?smile.gif Wprowadz poprawki, wrzuc nowa wersje i jedziemy dalej tongue.gif
Go to the top of the page
+Quote Post
mateuszstr1994
post 18.02.2018, 22:53:20
Post #7





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 31.10.2014

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


  1. <?php
  2. class DatabaseConnection
  3. {
  4. private $db_name = 'db_name';
  5. private $db_user = 'db_user';
  6. private $db_pass = 'db_pass';
  7. private $db_host = 'db_host';
  8. private $connect;
  9.  
  10. function __construct()
  11. {
  12. $this->connect = new mysqli($this->db_host,$this->db_user,$this->db_pass ,$this->db_name);
  13. $this->error_connect_database();
  14. $this->set_query_utf8();
  15. }
  16.  
  17. private function error_connect_database()
  18. {
  19. if($this->connect->connect_errno)
  20. throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');
  21. }
  22.  
  23. private function set_query_utf8()
  24. {
  25. $wynik_zapytania=$this->connect->query("SET NAMES 'utf8'");
  26. if($wynik_zapytania === false)
  27. throw new Exception('Ustalenie kodowania połączenia z Bazą danych MySql nie powiodło się');
  28. }
  29.  
  30. public function prepare_query($query)
  31. {
  32. $result_prepare=$this->connect->prepare($query);
  33. if($result_prepare === false)
  34. throw new Exception('Wykonanie zapytania nie powiodło się');
  35. return $result_prepare;
  36. }
  37. }
  38.  
  39. class UserAuthorizer
  40. {
  41. protected $connection;
  42.  
  43. function __construct($connect)
  44. {
  45. $this->connection=$connect;
  46. }
  47.  
  48. public function authorize($login, $password)
  49. {
  50. $result_query=$this->connection->prepare_query("SELECT password FROM users where login = ?");
  51. $result_query->bind_param("s", $login);
  52. $result_query->execute();
  53. $result_query->bind_result($password_from_database);
  54. $row = $result_query->fetch();
  55.  
  56. if (empty($row)) {
  57. throw new Exception('Użytkownik o podanym loginie nie istnieje.');
  58. }
  59.  
  60. if (password_verify($password, $password_from_database) === false) {
  61. throw new Exception('Błędne hasło.');
  62. }
  63. }
  64. }
  65.  
  66. try
  67. {
  68. $connect=new DatabaseConnection(); //DI wstrzykiwanie zaleznosci
  69. $egzemplarz=new UserAuthorizer($connect);
  70. $egzemplarz->authorize('login','password');
  71. }
  72. catch(Exception $e){
  73. echo $komunikat=$e->getMessage();
  74. }
  75.  
  76. ?>


Ten post edytował mateuszstr1994 18.02.2018, 22:59:11
Go to the top of the page
+Quote Post
markuz
post 18.02.2018, 23:24:39
Post #8





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


1. Używaj tylko angielskich nazw (wyjątki dalej po PL)
2. Formatuj ładnie kod smile.gif (https://www.php-fig.org/psr/psr-2/) (nadal brak formatowania)
3. Nie twórz klas które są "aliasami" innych klas - klasa database nic nie wnosi. (nadal klasa DatabaseConnection nie robi za dużo, wystarczy użyć wbudowanego np. PDO i ta klasa nie jest potrzebna)
4. Nie twórz klas w konstruktorach tylko je "wstrzykuj" - czytaj o DI (to wzorzec, w OOP jest dużo wzorców bez nich OOP nie ma sensu na dłuższą mete). (Jeszcze brakuje wstrzyknięcia niektórych zależności w DatabaseConnection)
5. Używaj PHP 7.2 (silne typowanie itp.) (brak typowania nadal)
6. Używaj phpunit/phpspec - naucz się pisać testy (brak testów)
7. Używaj namespace`ów i composera (https://www.php-fig.org/psr/psr-4/) (brak namespace)

Tyle ode mnie smile.gif

Ten post edytował markuz 18.02.2018, 23:26:16


--------------------
Go to the top of the page
+Quote Post
mateuszstr1994
post 18.02.2018, 23:33:43
Post #9





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 31.10.2014

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


Dziękuje za odpowiedź, jak na pierwszy dzień z OOP to chyba nie jest tak źle smile.gif Czeka mnie jeszcze dużo pracy, no cóż trzeba ćwiczyć.
Go to the top of the page
+Quote Post
Pilsener
post 20.02.2018, 23:27:24
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


  1. class DatabaseConnection

  1. $db_name

To czemu nie database_connection? Camel case wszędzie.
Albo o to:
  1. if($this->connect->connect_errno)
  2. throw new Exception('Połączenie z serwerem bazy danych nie powiodło się');

Cytat
Don't sacrifice clarity for brevity
(specjalnie bez literówki, ja zawsze wstawiam "brewity" nerdsmiley.png )

Oczywiście to tylko przykłady (bo całość jest do zaorania).
Nie ucz się sam na jakiś totalnie abstrakcyjnych przykładach, bo nauczysz się tylko złych nawyków a w dodatku nie jest to traktowane jako doświadczenie/staż pracy. Lepiej dołącz do jakiegoś zespołu programistów.
Go to the top of the page
+Quote Post
Lion
post 2.03.2018, 19:15:18
Post #11





Grupa: Zarejestrowani
Postów: 148
Pomógł: 14
Dołączył: 23.02.2013

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


Dobrze by było jakbyś zaczął od napisania do chcesz osiągnąć, do czego to ma służyć, jakie są założenia.


--------------------
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: 19.03.2024 - 04:26