Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> System zarządzania biblioteką.
black008
post 27.10.2012, 02:30:53
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 31.08.2007

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


Witam, postanowiłem na poważnie zabrać się za naukę OOP. W tym celu założyłem sobie stworzenie aplikacji webowej która będzie pomocna w bibliotece. Mianowicie będzie można wypożyczać książki, sprawdzać ich dostępność itd.

Jak na razie stworzyłem bazę danych i kilka podstawowych klas m. in. klasę do obsługi bazy danych. Mam wielką prośbę do osób, które znają się lepiej na OOP czy konwencja jaką przyjąłem i sposób pisania kod są odpowiednie. Liczę na przydatne wskazówki i uwagi. Poniżej listing klasy do zarządzania bazą danych i listing klasy logowania.

  1. class Db {
  2. static private $foo;
  3.  
  4. public function __construct()
  5. {
  6. self::$foo = new mysqli("localhost","root","","biblioteka");
  7. }
  8.  
  9. public static function Query($zapytanie)
  10. {
  11. $temp = self::$foo->query($zapytanie);
  12. return $temp;
  13. }
  14. }
  15.  
  16. $temp = new Db();


  1. class Logowanie extends Walidacja {
  2.  
  3. private $login;
  4. private $password;
  5.  
  6. public function setLogin($login)
  7. {
  8. $this->login = $this->setZmienna($login);
  9. }
  10.  
  11. public function setPassword($password)
  12. {
  13. $this->password= $this->setZmienna($password);
  14. }
  15.  
  16. public function getLogin()
  17. {
  18. return $this->login;
  19. }
  20.  
  21. public function getPassword()
  22. {
  23. return $this->password;
  24. }
  25.  
  26.  
  27. public function Zaloguj()
  28. {
  29. $fff = Db::Query("select `id`, `pswd` from `users` WHERE `login`='".$this->getLogin()."'");
  30.  
  31. $result = $fff->fetch_array();
  32. echo $result['pswd'];
  33.  
  34. //sprawdzenie wpisanych danych z zawartosć w bazie danych
  35. if ($result['pswd'] == $this->getPassword())
  36. {
  37. //ustawienie zmiennej sesyjnej
  38. $_SESSION['zalogowany']=$result['id'];
  39. //$query=mysql_query("UPDATE `users` SET `time_log`='".time()."' WHERE `id`='".$_SESSION['zalogowany']."'");
  40. //odݷieࠥnie srony
  41. echo '<meta http-equiv="refresh" content="0"; URL=index.php">';
  42. }
  43. else
  44. {
  45. //jezeli logowanie bledne
  46. echo 'BԪdne logowanie';
  47. // echo '<meta http-equiv="refresh" content="1"; URL=index.php">';
  48. }
  49. }
  50. }
Go to the top of the page
+Quote Post
KotWButach
post 27.10.2012, 03:44:49
Post #2





Grupa: Zarejestrowani
Postów: 361
Pomógł: 10
Dołączył: 8.02.2012

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


  1. self::$foo = new mysqli("localhost","root","","biblioteka");


dlaczego static lepiej tworzyć obiekt przez singleton i dalej używać instancji.
dlaczego foo? a nie $db
dlaczego mysqli nie PDO?
"localhost","root","","biblioteka" <---? Dlaczego brakuje pliku konfiguracyjnego.

  1. echo '<meta http-equiv="refresh" content="1"; URL=index.php">';?


questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif

OOP to nie wkładanie metod do klas...

O wzorcach architektonicznych narazię pomilczę.

  1. public function Zaloguj()


ma zalogowac i zwrocic true (or ID and LVL) lub false nic poza... tak myślę.


opisuj metody inaczej się pogubisz za tydzień otworzysz kodzik i zapytasz sam siebie o co temu gościowi chodziło biggrin.gif

  1. $this->setZmienna($password);


raczej $this->isPassword ewentualnie $this->isNumeric or $this->isString a w ogóle nie extends Walidacja tylko Walidacja jako helper czym jest helper niczym wiecej jak klasą niepowiązaną która zawiera np statyczne metody walidacji danych bądź jak się później okażę podczas tworzenia w MVC nie będą statyczne dla prostoty... ja zapis mam taki sam jak w CI a więc $this->Validate->string(); ale to tylko dlatego że pewna metoda ładuje mi z automatu potrzebne biblioteki ale jest to metoda loader nie rozszerzenie o klasę.

  1. $fff


Nie nie nie ... Ma być ładna nazwa według PSR-0 http://phpedia.pl/wiki/Konwencja_nazewnictwa_PSR-0

  1. $fff = Db::Query("select `id`, `pswd` from `users` WHERE `login`='".$this->getLogin()."'");


a nie można tak password? poza tym SELECT nie select tak się dużo lepiej czyta.

i dlaczego
  1. $temp = new Db();

raz nie temp tylko co najmniej $db opisowo opisowo... w tempie to możesz przechowywać obrazki (folder). Co by tu jeszcze nie Db db(); albo lepiej new dataMenager().

I wywołujesz to nie poza klasą tylko w metodzie w której chcesz coś wyciągnąć jako singleton bardzo prosty wzorzec.
a
Jest 5 rano wiec jak cos pomieszałem niech mnie ktoś poprawi bo ogólnie to myślę że na OOP jeszcze nieco za wcześnie ale kto nie walczy z trudnościami ten stoi w miejscu co nie? wink.gif

Ten post edytował KotWButach 27.10.2012, 04:08:33
Go to the top of the page
+Quote Post
tehaha
post 27.10.2012, 03:50:56
Post #3





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


nie wiele tutaj do oceniania, ale z moich uwag to tak:
- osobiście wybrałbym PDO, ale mysqli też w ostateczności może być;
- w Twoim przypadku klasa do obsługi bazy danych jest bez sensu, ponieważ nie wprowadza nic nowego, sam obiekt mysqli/pdo jest wystarczający;
- jeżeli klasa potrzebuje czegoś z zewnątrz to powinna to otrzymać w konstruktorze, czyli przykładowo zamiast tworzyć metody statyczne w obiekcie bazy, przekazujesz obiekt bazy w konstruktorze i wywołujesz zapytanie w metodzie przez $this->_db->query("SELECT...") oraz w Twojej klasie Db dane logowania również powinny zostać przekazane w konstruktorze;
- najlepiej jakby sesja również była przekazanym obiektem, ponieważ w pewnym momencie możesz stwierdzić, że chcesz samodzielnie obsługiwać sesję na bazie, ale przy pierwszych krokach to raczej mało istotne.
- w klasie nie powinny znajdować się funkcję typu echo, print, ponieważ model logowania ma odpowiadać tylko za autoryzację, a nie za wyświetlanie widoku, więc tutaj powinno być tylko return true/false.
- Klasa logowanie nie powinna być dziedziczona po Walidacji, ponieważ logowanie tylko korzysta z walidacji, a nie jest jego wyspecjalizowaną formą, dlatego obiekt walidacji powinien zostać przekazany w konstruktorze.
- ogólnie działanie klasy Logowanie jest kompletnie pomieszane, w linijce 29 w zapytaniu używasz $this->getLogin(), ale przecież nigdzie wcześniej nie zdefiniowałeś tej zmiennej więc będzie ona pusta, tak samo z $this->getPassword() w 35 linijce. Chyba się do końca nie zastanowiłeś jak to powinno działać.
- i jeszcze jedna rzecz, która jakoś szczególnie mnie irytuje to pomieszanie polskiej i angielskiej nomenklatury, generalnie składania php, mysql, html, css, js jest po angielsku więc najlepiej naucz się nazywać wszystko po angielsku, bo wtedy wszystko jest o wiele bardziej przejrzyste.

Powiem Ci wprost: Jeśli chcesz się nauczyć OOP to zacznij od jakiejś dobrej książki, bo tak po omacku to daleko nie zajdziesz, zajrzyj do działu Książki na tym forum.
Go to the top of the page
+Quote Post
black008
post 27.10.2012, 12:01:11
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 31.08.2007

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


Dziękuje bardzo za wasze uwagi. Na pewno będą bardzo pomocne. Właśnie zdałem sobie sprawę że przede mną jeszcze dużo nauki smile.gif Poprawiłem już obsługę bazy danych. Postanowiłem przejść jednak na PDO. Teraz wygląda to tak:

plik: config.php
  1. $dsn = 'mysql:dbname=biblioteka;host=localhost' ;
  2. $user = 'root' ;
  3. $password = '' ;
  4.  
  5. try {
  6. $db = new PDO ( $dsn , $user , $password );
  7. }
  8. catch ( PDOException $e ) { echo 'Connection failed: ' . $e -> getMessage (); }


plik: index.php
  1. include_once("config.php");
  2.  
  3. class Przyklad {
  4. private $handler_db;
  5.  
  6. function __construct(PDO $db)
  7. {
  8. $this->handler_db = $db;
  9. }
  10.  
  11. public function PrzykladowaFunkcja()
  12. {
  13. $temp = $this->handler_db->query("SELECT * FROM users");
  14. foreach($temp as $row)
  15. {
  16. echo '<li>'.$row['login'].': '.$row['pswd'].'</li>';
  17. }
  18. $temp-> closeCursor();
  19. }
  20. }
  21.  
  22. $foo = new Przyklad($db);
  23. $foo -> PrzykladowaFunkcja();
  24.  


Czy tak to może być questionmark.gif Oczywiście kod działa smile.gif
Go to the top of the page
+Quote Post
d3ut3r
post 27.10.2012, 12:04:46
Post #5





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


O wiele lepiej, jednak postaraj się aby w metodach nie było echo lepiej żeby zwracały coś za pomocą return lub wyrzucał wyjątek wówczas możesz zrobić tak:

  1.  
  2. try{
  3.  
  4. $foo = new Przyklad($db);
  5. echo $foo->PrzykladowaFunkcja();
  6.  
  7. } catch (Exception $e){
  8.  
  9. echo "Wystąpił błąd:". $e->getMessage();
  10.  
  11. }
  12.  



--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
black008
post 27.10.2012, 13:00:44
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 31.08.2007

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


A czy jest sens tworzenia specjalnie osobnej klasy do obsługi bazy danych questionmark.gif I co taka klasa miała by robićquestionmark.gif Tak tylko się zastanawiam czy moje rozwiązanie jest wystarczająco dobre?
Go to the top of the page
+Quote Post
tehaha
post 27.10.2012, 13:15:41
Post #7





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


do podstawowego użytkownika PDO jest całkowicie wystarczające, szczerze mówiąc nie wiem co mogłaby dodatkowo robić klasa opakowująca, może np. gdybyś w rozbudowanym systemie chciał stworzyć statystyki wykonywanych zapytań, wtedy można by poszerzyć funkcjonalność pdo i wykonać przy każdym zapytaniu dodatkowe operacje. Ale na początku możesz o tym zapomnieć.
Go to the top of the page
+Quote Post
d3ut3r
post 27.10.2012, 13:18:33
Post #8





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


To zależy jak zaprojektujesz swoją aplikację, dziś większość aplikacji stara się w mniej lub bardziej udany sposób implementować wzorzec MVC, o którym napisano tutaj już chyba książkę smile.gif Tworząc klasę do obsługi artykułów nie tworzysz rozszerzenia klasy do obsługi bazy danych a piszesz klasę która może np dodawać artykuł, pobierać, usuwać, modyfikować. W takim przypadku ta klasa będzie pełniła funkcję modelu czyli będzie odpowiedzialna za pobranie / zapisanie danych do źródła danych.

W modelu MVC (naprawdę polecam skorzystać z wyszukiwarki na forum bo jest tego multum) kontroler odbiera żądanie wywołuje model pobiera dane i wrzuca do widoku którego zadaniem jest te dane zaprezentować. Dlatego jeżeli twoja klasa zwróci tablicę artykułów możesz zrobić kilka widoków np widok html gdzie wyświetlisz artykuły w <li></li> ale też widok xml gdzie wyświetlisz te same artykuły w inny sposób.

Dzięki temu zyskujesz uniwersalną klasę do obsługi artykułów nie ważne co później chcesz z nimi zrobić smile.gif. Mam nadzieje że trochę pomogłem smile.gif choć wiem że temat na pierwszy rzut oka wydaje się trudny to trzymając się zasad i korzystając z wzorców na dłuższą metę ułatwiasz sobie życie.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
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.04.2024 - 11:39