Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ocena logowania OOP początkujący
Forum PHP.pl > Inne > Oceny
mateuszstr1994
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.  
markuz
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/)
kapslokk
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
nospor
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
mateuszstr1994
Dziękuje za pomoc, temat do zamknięcia smile.gif
kapslokk
Czemu do zamkniecia ?smile.gif Wprowadz poprawki, wrzuc nowa wersje i jedziemy dalej tongue.gif
mateuszstr1994
  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. ?>
markuz
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
mateuszstr1994
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ć.
Pilsener
  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.
Lion
Dobrze by było jakbyś zaczął od napisania do chcesz osiągnąć, do czego to ma służyć, jakie są założenia.
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.