Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Połączenie z bazą danych, raz., Wygodne i bez zbędnego pisania
fannet
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 28.11.2005

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


Witajcie piszę ponieważ mam od dłuższego czasu problem związany z programowaniem obiektowym, otóż staram się uczyć, ale nie jakoś chce do tej głowy wpadać, no ale do rzeczy otóż staram się pisać jakieś klasy w nich metody, ale większość z nich wymaga połączenia z bazą danych i wychodzi że na 10 klas w każdej mam w konstruktorze coś takiego:
  1. <?php
  2. function __construct()
  3. {
  4.  if(!$this->connect = new mysqli(HOST, USER, PASS, NAME))
  5.  {
  6.    throw new Exception("jak zwykle złe połączenie");
  7.  }
  8. }
  9. ?>
W programowaniu obiektowych chyba podstawowym założeniem jest aby kod się nie powtarzał i żeby jeden napisany kod był wykorzystywany wiele razy, a w moim przypadku wygląda to zupełnie odwrotnie.. Proszę o jakieś naprowadzenie mnie na tą właściwą drogę w mojej i tak już pomieszanej nauce.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Tarcil
post
Post #2





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 24.11.2006

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


Witam

Chciałbym dorzucić mój problem do tego tematu.

Napisałem klasę, która w konstruktorze tworzy połączenie z bazą danych oraz zawiera metody insertQuery, selectQuery itd, które przygotowują zapytanie do bazy, wykonywane prywatną metodą doQuery. Wszystko chodziło pięknie, ale był problem, kiedy przyszło zagnieździć zapytanie do bazy w zapytaniu. Już tłumaczę:

Załóżmy, że mamy dwie tabele.
  1. <?php
  2. Tabela news:
  3. ID int
  4. title varchar(255)
  5. time int
  6. text text
  7. authorID
  8. ?>

  1. <?php
  2. Tabela administrators:
  3. ID int
  4. name varchar(40)
  5. pass char(32)
  6. ?>


Tworzę sobie egzemplarz obiektu do obsługi bazy
  1. <?php
  2. $sql = new mySql(HOST, USER, PASS, NAME)
  3. ?>


Wyszukuję newsy w bazie:
  1. <?php
  2. $sql->selectQuery('title, time, authorID', 'news');
  3. while($news = $sql->fetchResults())
  4. {
  5. //wyświetlam news
  6. //tutaj musze wykonać coś takiego:
  7. mysql_query('SELECT name FROM administrators WHERE id='.$news['authorID']);
  8.  
  9. }
  10. ?>


Tyle, że nie po to pisałem klasę, żeby używać mysql_query(). To jedna sprawa, druga jest taka, że jeśli zamiast mysql_query() użyję znów $sql->selectQuery to zmieni mi to zapytanie używane do przewijania wyników w linijce while($news=$sql->fetchResults(). Muszę więc tworzyć dodatkowy obiekt (a to jest drugie połączenie z bazą danych - coś, czego trzeba unikać).
Sprawę rozwiązałem tak, że wydzieliłem kod połączenia z bazą danych do klasy mySqlConnect, a zapytania do klasy mySqlQueries. Tworzę jedno połączenie z bazą, a potem odpowiednio do potrzeb tworzę obiekty odpowiadające za przygotowanie zapytań do bazy:
  1. <?php
  2. $sql = new mySqlConnect(HOST, USER, PASS, DBNAME);
  3. $query_news = new mySqlQueries($sql->handler);
  4. $query_author = new mySqlQueries($sql->handler);
  5. $query_news->selectQuery('id, title, text, authorID', 'news');
  6. while($news = $query_news->fetchResults())
  7. {
  8. //wyświetlanie newsa...
  9. $query_author->selectQuery('name', 'administrators', 'id='.$news['authorID']);
  10. $admin = $query_author->fetchResults();
  11. //wyświetlenie nazwy autora newsa
  12. }
  13. $query_news->__destruct();
  14. $query_author->__destruct();
  15. ?>


Tak to działa u mnie... tylko, że coś mi mówi, że to nie jest dobre podejście... Czy ktoś podejmie się oceny takiego rozwiązania i ewnetualnie wskaże mi bardziej właściwą drogę?

Pozdrawiam
Tarcil
PS. Przepraszam, jeżeli wciąłem się w złym temacie.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 19:48