Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> klasy do sprawdzenia
tukan
post 5.07.2012, 22:25:09
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 19.06.2011

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


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. ?>
Go to the top of the page
+Quote Post
Mephistofeles
post 5.07.2012, 22:37:28
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Ź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).
Go to the top of the page
+Quote Post
tukan
post 5.07.2012, 22:47:21
Post #3





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 19.06.2011

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


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?
Go to the top of the page
+Quote Post
Mephistofeles
post 5.07.2012, 22:54:55
Post #4





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


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.
Go to the top of the page
+Quote Post
tukan
post 8.07.2012, 10:12:52
Post #5





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 19.06.2011

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


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

Ten post edytował tukan 8.07.2012, 10:15:26
Go to the top of the page
+Quote Post
empty
post 10.07.2012, 07:28:51
Post #6





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 29.07.2004

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


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

Ten post edytował empty 10.07.2012, 07:30:00
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: 18.08.2025 - 20:07