Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]jedna baza, 2 x DAO
Forum PHP.pl > Forum > Przedszkole
slwy
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?
c3zi
Zapoznaj się ze wzorcem singleton. Nadje się tutaj doskonale.
slwy
  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?
erix
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.
jarek_bolo
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.
slwy
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ę
erix
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
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.