Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obiekt artykuł
Forum PHP.pl > Forum > PHP
tukan
Witam,
postanowiłem nauczyć się obiektówki, ponieważ mam już jakieś podstawy z C++ to pomyślałem, że najlepszym sposobem będzie stopniowe pisanie CMS. I tak napisałem klasę artykułów:
  1. class Article {
  2. public $title;
  3. public $content;
  4. public $date_send;
  5. public $date_publicate;
  6. public $autor_viewer;
  7. public $autor;
  8. public $status;
  9. public $short_content;
  10. public $id;
  11.  
  12.  
  13. public function setTitle($title) {
  14. $this -> title = $title;
  15. }
  16.  
  17. public function setContent($content) {
  18. $this -> content = $content;
  19. }
  20.  
  21. public function setShortContent($id) {
  22. $pdo = new PDO('mysql:host=localhost;dbname=CMS', 'root', 'vertrigo');
  23. $pdo -> SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  24. $prepare = $pdo -> prepare("SELECT * FROM articles WHERE id_article = :id");
  25. $prepare -> bindValue(':id', $id, PDO::PARAM_INT);
  26.  
  27. $prepare ->execute();
  28.  
  29.  
  30. $Content = $prepare->fetch();
  31. $Content = explode('<!-- pagebreak -->', $Content['article_content']);
  32.  
  33. $this->short_content = $Content[0];
  34. }
  35.  
  36. public function AddToBase() {
  37.  
  38. $pdo = new PDO('mysql:host=localhost;dbname=CMS', 'root', 'vertrigo');
  39. $pdo -> SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  40. $prepare = $pdo -> prepare("INSERT INTO articles (article_title, article_content, date_publicate, autor) VALUES (:article_title, :article_content, :date_publicate, :autor)");
  41. $prepare -> bindValue(':article_title', $this -> title, PDO::PARAM_STR);
  42. $prepare -> bindValue(':date_publicate', $this->date_publicate, PDO::PARAM_STR);
  43.  
  44. $prepare -> bindValue(':article_content', $this -> content, PDO::PARAM_STR);
  45. $prepare -> bindValue(':autor', $this->autor, PDO::PARAM_STR);
  46.  
  47. //$prepare->bindValue(':autor', $this->autor, PDO_PARAM_STR);
  48. $prepare -> execute();
  49. $prepare->closeCursor();
  50. }
  51.  
  52. public function setAutor($login) {
  53. $this -> autor = $login;
  54. }
  55.  
  56. public function setDate() {
  57. $this->date_publicate = date("Y-m-d H:i:s", time());
  58.  
  59. }
  60. }

Proszę o sugestie, pewnie ten kod w ogóle nie jest "składni" i poprawny obiektowo. Obiektu tej klasy będę używał przy dodawaniu, edycji, usuwania, wyświetlania artykułu. Klasa nie jest jeszcze skończona.


cycofiasz
Jako laik w OOP mogę jedynie się przyczepić do sposobu łączenia się z bazą (szukaj pod frazą "singleton") i chyba jeżeli używasz setterów typu setTitle() to zmienna $title powinna być private.
I jeszcze w AddToBase() nie sprawdzasz czy wymagane zmienne są ustawione
KrzysiekWildfire
w PHP jest także dużo magii, zainteresuje się funkcjami __set() oraz __get(), dzięki nim będziesz mógł w łatwy sposób sprawdzić, czy dana zmienna istnieje. Proponuję Ci także stworzyć obiekt odpowiadający za łączenie się z bazami danych aby nie powtarzać tego całego kodu.

No i proponuję Ci zapoznać się z jakimś frameworkiem, to wszystko co tu napisałeś jest w 50% zrobione w frameworku.

ShortContent możesz zrobić w inny sposób, ponieważ jest to artykuł więc zapewne posiada paragrafy, więc możesz wyświetlać tylko pierwszy paragraf taką linijką:
  1. echo current(explode('</p>'.$article->content)).'</p>';

melkorm
  1. echo current(explode('</p>'.$article->content)).'</p>';


Błąd składniowy + słabe rozwiązanie.

Co do samej klasy nie ma się co wypowiadać, było już kilka tematów na forum które chyba wyczerpały ten temat w 100%, ale kilka uwag:

+ klasa nie powinna zajmować się połączeniem do bazy
+ dla czego dla każdego pola robisz set*

ogólnie to ja na Twoim miejscu bym zrobił bardziej coś w stylu:
  1. class Article
  2. {
  3.  
  4. // pola publiczne - najprawdopodobniej odpowiedniki z DB
  5. // ....
  6.  
  7. // i metodę do dodawania i edycji (edit*)
  8. public function save()
  9. {
  10. // wywołanie obiektu bazy i zapytanie
  11. }
  12. // i do usuwania
  13. public function delete()
  14. {
  15. // wywołanie obiektu bazy i zapytanie
  16. }
  17. }


Zresztą spójrz jak to inne frameworki rozwiązują i zainteresuj się pojęciem ActiveRecordu smile.gif
tukan
  1. public function save() {
  2. $hdb = new ConnectDB('localhost', 'CMS', 'root', 'vertrigo');
  3. //$pdo = new PDO('mysql:host=localhost;dbname=CMS', 'root', 'vertrigo');
  4. //$pdo->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5. $prepare = $hdb->$hdb->prepare("INSERT INTO articles (article_title, article_content, date_send, autor) VALUES (:article_title, :article_content, :date_send, :autor)");
  6. $prepare->bindValue(':article_title', $this->title, PDO::PARAM_STR);
  7. $prepare->bindValue(':date_publicate', $this->date_publicate, PDO::PARAM_STR);
  8.  
  9. $prepare->bindValue(':article_content', $this->content, PDO::PARAM_STR);
  10. $prepare->bindValue(':autor', $this->autor, PDO::PARAM_STR);
  11.  
  12. //$prepare->bindValue(':autor', $this->autor, PDO_PARAM_STR);
  13. $prepare->execute();
  14. $prepare->closeCursor();
  15. }
  16.  
  17.  
  18. }
  19.  
  20. class ConnectDB
  21. {
  22. private $hDB;
  23.  
  24. public function _construct($host, $dbname, $login, $pass)
  25. {
  26. $this->hDB = new PDO('mysql:host='.$host.';dbname='.$dbname.','.$login.','.$pass.',');
  27.  
  28. }
  29. }
  30.  

Próbuję dostosować się do Waszych wskazówek, ale nie bardzo mi to idzie thumbsdownsmileyanim.gif . Napisałem klasę łączącą się z bazą danych, ale dalej nie wiem jak to "ciągnąć" tzn. jak to wykorzystać do save()wowania artykułów, co do samej klasy łączącej się nie jestem pewien,
liczę na Waszą pomoc
gac3k
to znaczy tak:

- kod który napisałeś wyżej, a właściwie klasa którą napisałeś do łączenia z bazą nie robi właściwie zupełnie nic innego niż wcześniej z użyciem PDO, jak już chciałbyś tak robić to rozszerzaj to PDO, w tą stronę nie kombinuj smile.gif
- koledzy wspominali o singletonie, ja Ci to odradzam, są znacznie lepsze metody, ale gdybyś już chciał ten singleton to zmieniasz konstruktor na prywatny, a resztę możesz doczytać w tutorialach, pełno ich w sieci, a prawie pod każdym będzie napisane żeby tego nie używać smile.gif
- Co do tego

  1. $this->date_publicate = date("Y-m-d H:i:s", time());


drugi argument w postaci funkcji time nie jest konieczny, PHP pobiera go wtedy z automatu, zmieniasz go tylko w przypadku innego czasu niż obecny, ale to już pierdółka smile.gif
tukan
Cytat(gac3k @ 14.08.2011, 20:20:20 ) *
- kod który napisałeś wyżej, a właściwie klasa którą napisałeś do łączenia z bazą nie robi właściwie zupełnie nic innego niż wcześniej z użyciem PDO, jak już chciałbyś tak robić to rozszerzaj to PDO, w tą stronę nie kombinuj smile.gif
- koledzy wspominali o singletonie, ja Ci to odradzam, są znacznie lepsze metody, ale gdybyś już chciał ten singleton to zmieniasz konstruktor na prywatny, a resztę możesz doczytać w tutorialach, pełno ich w sieci, a prawie pod każdym będzie napisane żeby tego nie używać smile.gif
- Co do tego

bardzo dziękuję za pomoc :-)
Do powyższego:
*mógłbyś rozwinąć 1 pauzę?
*szukałem tutoriali na ten temat i nie znalazłem smile.gif
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.