Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasy do sprawdzenia
Forum PHP.pl > Forum > PHP
tukan
Witam,
Chciałbym Wam zaprezentować 3 "szablony" klas, klasę kategorii, artykułu i pseudo-obsługi bazy danych. Te klasy nie są całkowicie gotowe ( ich funkcjonalność), ale daję je pod Wasze profesjonalne oko, żebyście już na początku mogli mnie pokierować na bardziej poprawne tory smile.gif. Zdaję sobie sprawę, że pewnie te klasy są paskudne, mało funkcjonalne itd. Ale o to właśnie chodzi, żeby się poprawiać wink.gif.
Z góry dzięki za każdą wypowiedź.
Pozdrawiam! smile.gif
  1. <?php
  2. class Database {
  3. public $host = "localhost";
  4. public $dbname = "articles";
  5. public $user = "root";
  6. public $pass = "vertrigo";
  7. public $dbh;
  8. function connect(){
  9.  
  10. try {
  11.  
  12. $this->dbh = new PDO("mysql:host=$this->host; dbname=$this->dbname", $this->user, $this->pass);
  13.  
  14.  
  15. echo "Połączenie nawiązane";
  16. } catch ( PDOException $error){ die("Failed to connect:".$error->getMessage());}
  17.  
  18. }
  19.  
  20. function set_coding($what)
  21. {
  22. $this->dbh->exec("SET NAMES ".$what);
  23. }
  24.  
  25.  
  26. }
  27.  
  28. class Taskplain{
  29.  
  30. public $content;
  31. public $solution;
  32. public $nr_original;
  33. public $id_autor;
  34. public $id_kategoria;
  35. public $points;
  36. public $id_date;
  37. public $link;
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. function __construct($content, $id_autor, $id_kategoria,$id_date,$link ){
  46. $this->content = $content;
  47. $this->id_autor = $id_autor;
  48. $this->id_kategoria = $id_kategoria;
  49. $this->id_date = $id_date;
  50. $this->link = $link;
  51.  
  52. }
  53.  
  54. function add($dbh)
  55. {
  56.  
  57. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  58. $sql = "INSERT INTO task_e( content, id_autor, id_kategoria, link) VALUES (:content, :id_autor, :id_kategoria, :link)";
  59. try {
  60. $q = $dbh->prepare($sql);
  61. }
  62. catch(PDOException $e){ print_r( $e->getTrace() );
  63.  
  64. }
  65. try {
  66. $q->execute(array(':content'=>$this->content,
  67. :id_autor'=>$this->id_autor,
  68. ':id_kategoria'=>$this->id_kategoria,
  69. :link'=>$this->link));
  70. }
  71.  
  72. catch(PDOException $e)
  73. {
  74. print_r( $e->getTrace() );
  75. }
  76. }
  77.  
  78.  
  79. }
  80.  
  81. class Category{
  82. public $id;
  83. public $name;
  84. public $ids = array();
  85. public $names = array();
  86.  
  87.  
  88. function addCategory($name, $dbh){
  89. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  90. $sql = "INSERT INTO category( name) VALUES (:name)";
  91. $q = $dbh->prepare($sql);
  92.  
  93.  
  94. try {
  95. $q->execute(array(':name'=>$this->name));
  96.  
  97. }
  98.  
  99. catch(PDOException $e)
  100. {
  101. print_r( "AddCategory: ".$e->getTrace() );
  102. }
  103. }
  104.  
  105. function __construct($name)
  106. {
  107. $this->name = $name;
  108.  
  109.  
  110. }
  111.  
  112.  
  113. function getCateogory($dbh){ // ta klasa miałaby mi tworzyć tablice ze wszystkimi kategoriami
  114.  
  115. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  116. $q = $dbh->prepare("SELECT * FROM autor");
  117. try{$q->execute();}
  118. catch(PDOException $e) { print_r( "getCategory: ".$e->getTrace() );}
  119.  
  120.  
  121.  
  122. while ($row = $q->fetch(PDO::FETCH_ASSOC))
  123. {
  124. array_push($this->names, $row['name']); // tu chciałbym zastosować lepszy pomysł, zamiast tego while użyć fetch.... z PDO
  125. array_push($this->ids, $row['id']);
  126. }
  127.  
  128.  
  129. }
  130.  
  131.  
  132.  
  133.  
  134. }
  135.  
  136. ?>
Mephistofeles
Źle!
Skoro tworzysz klasę do obslugi bazy danych to nie przenoś tej obsługi do innych.
W ogóle nie ma sensu tworzyć oddzielnej klasy do bazy, i tak wykorzystujesz PDO, a nie tworzysz tu czegoś na miarę Doctrine DBAL (poczytaj, może wykorzystasz).
Masz 2 możliwości:
-obiekt artykułu dostaje obiekt PDO i sam wykonuje potrzebne zapytania
-istnieje drugi obiekt, który wykorzystując obiekt artykułu zapisze dane korzystając z przekazanego mu obiektu PDO.
Pomijam rozwiązania typu ORM, bo chyba nie tego oczekujesz, ale warto się nimi zainteresować (Doctrine, Propel).
tukan
Czyli usunąć całkowicie tą klasę bazodanową?
Nie wiem do końca co masz na myśli mówiąc 'obiekt PDO', czy obiekt tej mojej klasy, czy czysty obiekt PDO? Jeśli ten czysty, to tworzę sobie w tym wypadku obiekt artykułu i dostarczam mu w parametrach do konstruktora uchwyt do bazy danych i w klasie artykuł już sobie operuję na bazie danych?
Mephistofeles
Czyste PDO.
Tak, jest to jedno z możliwych podejść. W konstruktorze raczej nie ustawiaj danych obiektu, a tylko wymagane zmienne.
Istnienie klasy Database tylko dla utworzenia połączenia nie ma za bardzo sensu.
tukan
Załóżmy sytuację:
Mam sobie tabelkę łączącą kategorie z artykułem, czyli kolumny to: id_kategorii, id_artykułu. Dodając w takim razie artykuł do bazy danych muszę równocześnie odwiedzić tą tabelkę i dodać wierz -id_artykuł-idkategorii. I teraz tak. Artykuł przyporządkowuję do kategorii za pomocą checkboxów, którcyh to wartości value wstawiałbym jako id_kategorii do tabeli.

Wiadomo, że formularz z checkboxami to będzie tablica z kilkoma wartościami. Jak to sprawnie "obrobić"? Jak wziąć tą wartość id_artykułu, którą będę wstawiał? Pobrać wcześniej, i przy wpisywaniu kolejnych id_kategorii wpisywać id_artykułu powiększone o 1.
W kilku słowach, jak to sprawnie rozwiązać?
pozdrawiam wink.gif
empty
dodajesz artykul do tabeli artykuly
id dodanego artykulu wyciagniesz tak
Kod
$id_artykulu = mysql_insert_id()

przechodzisz po wszystkich checkboxaxh i dla kazdego zaznaczonego dodajesz wiersz do tabeli artykul-kategoria
wszystko mozna wykonac jednoczesnie po wcisnieciu submita
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.