Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL]jedna baza, 2 x DAO
slwy
post 21.01.2009, 22:43:25
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 6.01.2009

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


Kazda tabela ma odpowiadający jej obiekt DAO odpowiedzialny za komunikację. W tym obiekcie tworzę nowe połączenie z bazą.
Ale mam problem, stworzyłem formularz, z którego dane chcialbym zapisac w 2 tabelach.
Muszę więc przerobić obiekty DAO, bo przecież bez sensu żeby na potrzeby komunikacji z jedną tabelą każdy obiekt DAO tworzył nowe połączenie. Wymyśliłem więc sprytnie (lub też nie-sprytnie), żeby każdy obiekt DAO dziedziczył po jakimś podstawowym obiekcie, który łączyłby się z bazą danych. W momencie tworzenia daoA miałbym już połączenie z bazą, tylko teraz jak to technicznie zrealizować tworząc obiekt daoB?

Moja propozycja:
  1. <?php
  2. class daoBasic {
  3.    // polaczenie z baza
  4.    var $connection;
  5.    var $db;
  6.  
  7.    function daoBasic () {
  8.    // tu w konstruktorze nastepowaloby polaczenie
  9.    }
  10. }
  11.  
  12. class daoA extends daoBasic {
  13.    function daoA () {
  14.        this->daoBasic();
  15.    }
  16. }
  17.  
  18. class daoB extends daoBasic {
  19.    function daoB () {
  20.          this->daoBasic();
  21.      }
  22. }
  23. ?>


wykonałem taki test:
  1. <?php
  2. $dao1 = new daoA();
  3. $dao1->go();
  4. $dao2 = new daoB();
  5. $dao2->go();
  6.  
  7. go() {
  8. $statement = "select * from tabela2";
  9. $query = mysql_query($statement)
  10. or die('ERROR: '.mysql_error());
  11. $row = mysql_fetch_assoc($query);
  12. print_r($query);
  13. print_r($row);
  14. }
  15. ?>

gdzie funkcja go pobiera dane odpowiednio z tabela1 lub tabela2 i wyświetla ich zawartość. wynikiem jest:
Kod
Resource id #3
Array
(
    [numer] => 1
    [nazwa] => val1
)
Resource id #4
Array
(
    [numer] => 2
    [nazwa] => val2
)

Czy w tym przypadku stworzyłem 2 połączenia? czy mogę stworzyć jedno połączenie na początku i z tego połączenia korzystać na stronie? Chciałem to po prostu zrobić dobrze i elegancko. Czy tak jest ok?

Ten post edytował slwy 22.01.2009, 00:19:16
Go to the top of the page
+Quote Post
c3zi
post 22.01.2009, 08:25:57
Post #2





Grupa: Zarejestrowani
Postów: 266
Pomógł: 20
Dołączył: 15.11.2006
Skąd: Koszalin

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


Zapoznaj się ze wzorcem singleton. Nadje się tutaj doskonale.


--------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Go to the top of the page
+Quote Post
slwy
post 22.01.2009, 12:09:33
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 6.01.2009

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


  1. <?php
  2. class daoBasic{
  3. [/font][font="Courier New"]    private static $_instance=null;
  4.    private function __construct(){ }
  5.    public static function getInstance(){
  6.        if (self::$_instance == null){
  7.            self::$_instance = new daoBasic();
  8.        }
  9.        return self::$_instance;
  10.    }
  11. }
  12. ?>


popraw mnie, jeśli źle do tego podchodzę: w konstruktorze dam kod odpwiadający za połączenie z bazą danych, następnie będę dziedziczył po tym obiekcie, tak?
Czy raczej ten obiekt będzie elementem każdej klasy - daoA, daoB etc.

po chwili zastanowienia - czy daoBase (singleton) może być składnikiem klas daoA i daoB (dodawany przez referencję w konstruktorze daoA i daoB?)

a tak w ogóle - czy to rozwiązanie którego teraz używam (2 obiekty każdy ma swoje połączenie) to bardzo złe i nieeleganckie rozwiązanie?

Ten post edytował slwy 22.01.2009, 15:35:40
Go to the top of the page
+Quote Post
erix
post 22.01.2009, 18:39:24
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
czy to rozwiązanie którego teraz używam (2 obiekty każdy ma swoje połączenie) to bardzo złe i nieeleganckie rozwiązanie?

Mało efektywne, gdyż ISP wprowadza zazwyczaj limity jednoczesnych połączeń per konto.

Cytat
w konstruktorze dam kod odpwiadający za połączenie z bazą danych, następnie będę dziedziczył po tym obiekcie, tak?
Czy raczej ten obiekt będzie elementem każdej klasy - daoA, daoB etc.

Nie. Każdy element DAO będzie się odwoływał do zasobu połączenia zapisanego w tej klasie. Jeśli będzie dziedziczył, to będzie trochę bez sensu, gdyż w dalszym ciągu każda klasa będzie miała osobne połączenie.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
jarek_bolo
post 25.01.2009, 10:20:09
Post #5





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

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


Stwórz oddzielny obiekt reprezentujący bazę danych. Będziesz się nim łączył, robił zapytania, otwierał i zamykał transakcje. Obiekty DAO natomiast muszą odwoływać się do tego obiektu bazy danych.


--------------------
"Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! |
Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!!
Go to the top of the page
+Quote Post
slwy
post 29.01.2009, 00:02:14
Post #6





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 6.01.2009

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


ok, czyli w dao moge mieć wszystkie pola i metody dowolne oraz funkcje generujące zapytania SQL w postaci string?
A w obiekcie basic wykonanie na bazie tego stringa i zwrócenie wyniku w postaci tablicy (lub id połączenia)? Chcę się upewnić że dobrze pojąłem ideę
Go to the top of the page
+Quote Post
erix
post 29.01.2009, 12:00:04
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Hmm, chyba nie do końca...

Jeśli zasób bazy, etc, będziesz trzymał w rodzicu obiektu DAO (czyli Twój basic), to połączenie będzie się powielać. Ale jeśli chodzi o logikę wykonania, że np. funkcje odpowiedzialne za sam dialog z bazą, które klasy potomne dziedziczą, to ok. smile.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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: 19.07.2025 - 15:01