Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Klasa OOP
neuroine
post 8.06.2010, 11:53:37
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 3
Dołączył: 6.05.2009

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


Stworzyłem taką prostą klasę, prosiłbym o informację czy jest napisana zgodnie z OOP.

class.articles.php
  1. class Articles {
  2.  
  3. private $db_host = 'localhost';
  4. private $db_name = 'database';
  5. private $username = 'root';
  6. private $password = 'root';
  7. private $section;
  8. private $mysqli;
  9. private $result;
  10.  
  11.  
  12. public function __construct() {
  13.  
  14. $this->mysqli = @new mysqli($this->db_host,$this->username,$this->password,$this->db_name);
  15. $this->mysqli->query('SET NAMES utf8');
  16.  
  17. if ($link->connect_error)
  18. {
  19. echo("Connect failed: %s\n". $mysqli->connect_error);
  20. exit();
  21. }
  22.  
  23. }
  24.  
  25. public function display () {
  26.  
  27. $this->result = $this->mysqli->query("SELECT id, title, date, content, autor FROM articles ORDER BY date DESC");
  28. while ($data = $this->result->fetch_object())
  29. {
  30. echo('<h1>'.$data->title.'</h1><p class="right">'.$data->date.'</p>');
  31. echo('<p class="justify">'.$data->content.'</p>');
  32. echo('<p>Add by: <b>'.$data->autor.'</b></p>');
  33. echo('<hr />');
  34. }
  35. $this->result -> close();
  36. $this->mysqli -> close();
  37. }
  38. }


index.php
  1. require_once ('class.articles.php');
  2.  
  3.  
  4. $testing = new articles();
  5. $testing->display();
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
zend
post 8.06.2010, 12:42:59
Post #2





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


Nie. Ani troche nie jest zgodna z podejściem obiektowym. to tylko kod opakowany w klase. W klasach się nic nie wyświetla. A jeśli będziesz chciał stworzyć inną klasę np komentarzy to też tam nawiążesz połączenie? Klasa powinna przyjmować połączenie do bazy jako parametr w konstruktorze, dodaj jeszcze kilka metod, dodawanie newsa, usuwanie newsa(ów), edycja i daj jeszcze raz do oceny

Ten post edytował zend 8.06.2010, 12:44:51
Go to the top of the page
+Quote Post
vokiel
post 8.06.2010, 13:06:00
Post #3





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Mam chwilę czasu, to taki mały wzór (oczywiście można to zrobić na wiele różnych sposobów, napisać interfejs dla samych artykułów, a później odpowiednie klasy do wyświetlania w wybranych formatach (na stronie, RSS, mailing etc)
  1. class Articles {
  2. private $_db;
  3.  
  4. public function __construct(database $db){
  5. $this->_db = $db;
  6. }
  7.  
  8. public function displayArticles($limit=3){
  9. $articles = $this->getArticles($limit);
  10. /* sprawdzenie poprawności etc */
  11. $ToReturn = '';
  12. foreach ($articles as $article){
  13. $ToReturn .= '<h1>'.$article['title'].'</h1>'; /* i reszta */
  14. }
  15. return $ToReturn;
  16. }
  17.  
  18. private function getArticles($limit){
  19. /* połączenie z bazą, zapytanie, zwrócenie wyników w formie tabeli */
  20. }
  21.  
  22. }


Użycie:
  1. $art = new Articles($db);
  2. echo $art->displayArticles();


--------------------
Go to the top of the page
+Quote Post
neuroine
post 6.07.2010, 16:04:03
Post #4





Grupa: Zarejestrowani
Postów: 21
Pomógł: 3
Dołączył: 6.05.2009

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


Jak mogę najkorzystniej połączyć się z bazą danych, spotkałem się z kilkoma podejściami

1. Dwie klasy mysql.php i articles.php jedna jest rozszerzeniem drugiej .
2. Wzorzec Singleton [nie wiem jak powinien wyglądać na moim przykładzie po dodaniu kilku klas]
3. Wzorzec Fabryka.

Walidacja powinna być wykonywana w klasie Articles, czy lepiej napisać uniwersalną umieszczoną w oddzielnym pliku?


  1. class Articles {
  2.  
  3. private $db_host = 'localhost';
  4. private $db_name = 'db';
  5. private $username = 'root';
  6. private $password = 'root';
  7.  
  8.  
  9. public function __construct($section, $title, $content, $autor) {
  10.  
  11. $this->mysqli = new mysqli($this->db_host,$this->username,$this->password,$this->db_name);
  12. $this->mysqli->query('SET NAMES utf8');
  13.  
  14. if ($link->connect_error)
  15. {
  16. echo("Connect failed: %s\n". $mysqli->connect_error);
  17. exit();
  18. }
  19.  
  20. $this->content = addslashes($content);
  21. $this->date = date('Y-m-d H:i:s');
  22. $this->autor = $autor;
  23. $this->section = $section;
  24. $this->title = $title;
  25. }
  26.  
  27. public function displayArticles() {
  28.  
  29. $result = $this->mysqli->query("SELECT id, title, date, content, autor FROM $this->section ORDER BY date DESC");
  30.  
  31. while ($row = $result->fetch_object())
  32. {
  33. echo('<h1>'.$row->title.'</h1><p class="right">'.$row->date.'</p>');
  34. echo('<p class="justify">'.$row->content.'</p>');
  35. echo('<p>Add by: <b>'.$row->autor.'</b></p><p id="'.$row->article_id.'" class="comment" >Comments: [');
  36. echo(']</p><p class="right">( Read more )</p>');
  37. echo('<hr />');
  38. }
  39.  
  40.  
  41. $result->close();
  42. }
  43.  
  44. public function checkArticle() {
  45.  
  46. if (empty($this->title) || empty($this->content) || empty($this->autor) || empty($this->section)) {
  47. echo ('You did not provide all the necessary information.');
  48.  
  49. }
  50. }
  51.  
  52. public function addArticles() {
  53.  
  54. $result = $this->mysqli->prepare("INSERT INTO $this->section (`title`, `content`, `date`, `autor`) VALUES (?, ?, ?, ?)");
  55. $result->bind_param("ssss", $this->title, $this->content, $this->date, $this->autor);
  56. $result->execute();
  57. $result->close();
  58. }
  59.  
  60. public function __destruct() {
  61.  
  62. $this->mysqli->close();
  63. }
  64.  
  65. }


Ten post edytował neuroine 6.07.2010, 16:13:16
Go to the top of the page
+Quote Post
zend
post 9.07.2010, 10:34:10
Post #5





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


1) Kiepskie podejście, lepiej stworzyć klasę podelu, a połączenie przekazywać jako parametr
2) Czego nie wiesz?
3) Jeśli korzystasz z podpowiadania składni, to nie polecam
4) Co osoba, to innej podejście, ja bym napisał osobną klasę, nie będziesz przez to musiał powielać tego samego kodu przy innych walidacjach
Go to the top of the page
+Quote Post
neuroine
post 9.07.2010, 20:15:13
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 3
Dołączył: 6.05.2009

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


1. Dobrze, mam klasę modelu articles.php, rozumiem że połączenie przekazuje w kontrolerze includując tam klasę z mysql.php
Wiadomo, że klasę mysql.php będę chciał nie raz użyć, wiec jak powinienem to rozwiązać. Sytuacja podobna gdy stworzę klasę walidacji.

2. Nie bardzo wiem od czego mam zacząć.

3. Nie korzystam z podpowiadania składni.

4. Walidacja na pewno przyda się nie raz.
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: 14.08.2025 - 06:06