Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Klasa OOP
Forum PHP.pl > Forum > Przedszkole
neuroine
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();
zend
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
vokiel
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();
neuroine
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. }
zend
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
neuroine
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.
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.