Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa bazy danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
_bezimienny
Być może gdzieś na forum jest podobny wątek do mojego problemu, ale nie potrafiłem go znaleźć.
Robię optymalną klasę obsługującą stronę operując na bazie danych.
Żeby połączyć się z bazą i wybrać tabelę, używam metody tworzenia nowego obiektu. W konstruktorze mam połączenie do bazy danych a w destruktorze mam:
  1. <?php
  2. mysql_free_result[$this->result];
  3. mysql_close[$this->connect]
  4. ?>

Tutaj mam głównego winowajce:
  1. <?php
  2. //zmienne z $this są zdefiniowane jako private w klasie
  3. function read($table,$array) // $table - nazwa tabeli w bazie, $array - zawiera pola w tabeli do wyświetlenia
  4. {
  5. $this->result = mysql_query("SELECT * FROM ".$table) or die ('Cannot do it!');
  6. if(mysql_num_rows($this->result)>0)
  7. {
  8. $this->rows=0;
  9. while($this->row = mysql_fetch_assoc($this->result))
  10. {
  11. for($this->colls=0;$this->colls<count($array);$this->colls++)
  12. {
  13. $temp = $array[$this->colls];
  14. $this->tab[$this->colls][$this->rows] = $this->row[$temp]; // dzieki temu mam dostep do tej tabeli z poza klasy (public)
  15.  
  16. }
  17. $this->rows++;
  18. }
  19. }
  20. }
  21. ?>

Tutaj jest problem. Jak mogę dostać dostęp do poszczególnych elementów w tablicy? Jak naprzykład chcę wyświetlić pole 'id'. Wewnątrz klasy to wyświetlałem to poprzez $row['id']; ale nie wiem jak sobie z tym poradzić poza klasą.
Do wyświetlenia wszystkich wpisów w bazie można zrobić takie coś:
  1. <?php
  2. for($i=0;$i<$base->rows;$i++)
  3. {
  4. for($j=0;$j<$base->colls;$j++)
  5. {
  6. echo $base->tab[$j][$i]."<br>";
  7. }
  8. }
  9. ?>

No ale nie mam pojęcia jak to zrobić inaczej, żeby nie wpisywać monotonnie $row['id']; tylko żeby było to dynamiczne. Dzięki temu mógłbym wykorzystywać tą metodę wiele razy.

Jakieś rozwiązania? Rady? Wskazówki?

PS. W kodzie mogą się pojawić naleciałości z c++, ale to musicie mi wybaczyć na początek biggrin.gif
JoShiMa
Ja wewnątrz takiej klasy wczytuję rekordy to tablicy. każde pole tablicy jest rekordem, czyli tablicą asocjacujną o nazwach pól dokładnie takich samych jak te zwrócone przez funkcję mysql_fetch_assoc(). Jeśli ta tablica jest zmienną publiczną to mam do niej dostęp spoza obiektu. Jeśli nie to moge sobie zrobić funkcję, która będzie mi tę tablicę zwracać na zewnątrz obiektu. Mam nadzieję, że nie zagmatwałam.
_bezimienny
Ale o którą tablicę Ci chodzi?
o $tab czy o $row?
$tab zwraca wszystkie wpisy z bazy
$row tylko po jednym wierszu

mogę też zrobić tak:
  1. <?php
  2. $row = 1;
  3. while($this->row = mysql_fetch_assoc($this->result))
  4. {
  5. for($this->colls=0;$this->colls<count($array);$this->colls++)
  6. {
  7. $temp = $array[$this->colls];
  8. $this->tab[$this->colls][0] = $temp;
  9. $this->tab[$this->colls][$this->rows] = $this->row[$temp];
  10.  
  11. }
  12. $this->rows++;
  13. }
  14. ?>

Tylko, że to przy każdym wpisie będzie przypisywać. Trochę bez sensu.
JoShiMa
Z rekordów, które u Ciebie nazywają się $row. Konstruuję sobie taką tablicę jaka mi pasuje. i tę tablicę wykorzystuję później w aplikacji.

Najczęściej działam tak, że mam klasę odpowiedzialną za połączenie z bazą i wykonanie zapytania. Potem tworzę klasy potomne obsługujące różne, potrzebne mi w aplikacji zapytania w specyficzny dla tych zapytań sposób. W aplikacji operuję obiektami klas potomnych.

Czasem robię tak, że klasy potomne mają identyczną budowę (własności i metody) i różnią się wyłącznie ciałem metod (coś na kształt interfejsu). To mi ułatwia obsługę obiektów tych klas.
_bezimienny
Do czego takiego dokładnie zmierzam biggrin.gif
Czyli masz klase odpowiedzialną tylko za połączenie do bazy i zapytania?
A jak według Ciebie... Lepiej tworzyć obiekt i łączyć się z bazą w konstruktorze klasy, czy lepiej staycznie odwoływać się poprzez scope operator :: do metody klasy odpowiedzialnej za połączenie?
JoShiMa
Cytat(_bezimienny @ 3.07.2008, 12:25:18 ) *
Czyli masz klase odpowiedzialną tylko za połączenie do bazy i zapytania?

Wykonanie zapytania, obsługę błędów połączenia z bazą oraz np zliczanie rekordów. Jednym słowem wszystko to co nie zależy od konstrukcji zapytania.

Cytat(_bezimienny @ 3.07.2008, 12:25:18 ) *
A jak według Ciebie... Lepiej tworzyć obiekt i łączyć się z bazą w konstruktorze klasy, czy lepiej staycznie odwoływać się poprzez scope operator :: do metody klasy odpowiedzialnej za połączenie?

W moich projektach najczęściej robię tak:
1. W konstruktorze klasy nadrzędnej definiuję parametry do połączenia z bazą.
2. W konstruktorze klasy potomnej konstruuję zapytanie w zależności od warunków, czyli paramterów przekazanych do konstruktora, bo tak też się zdarza
3. To zapytanie jest własnością klasy nadrzędnej
4. wykonuję zapytanie metodą, która u mnie nazywa się $this->polaczenie(); i wygląda tak:
  1. <?php
  2. function polaczenie($rekordy=1){
  3. if (!(mysql_connect($this->sql_serwer, $this->sql_login, $this->sql_haslo)
  4. and mysql_select_db($this->sql_baza)))
  5. return false;
  6. mysql_query("set names 'latin2'");
  7. $this->wynik_zapytania = mysql_query($this->zapytanie);
  8. if($rekordy) $this->get_ilosc_rekordow();
  9. }
  10. ?>

5. W ten sposób mam wczytane rekordy do zmiennej $wynik_zapytania, która jest własnością klasy nadrzędnej. Potem w metodzie klasy dziedziczącej sobie to obrabiam jak mi się podoba.

Podsumowując. Konstrukcja i wykonanie zapytania odbywa się u mnie najczęściej w konstruktorze klasy dziedziczącej, ale to nie jest reguła, po prostu najczęściej jest to dla mnie wygodne.
_bezimienny
A jak odwołujesz się do klasy?
  1. <?php
  2. $base = new BaseName();
  3. $base->polaczenie();
  4. ?>

Czy poprzez statyczny operator:
  1. <?php
  2. BaseName::polaczenie();
  3. ?>

W tym pierwszym zaraz po utworzeniu obiektu wykonuje się:
  1. <?php
  2. function __construct()
  3. {
  4.  //polaczenie do basy i wybor tabeli
  5. }
  6. ?>

Tylko że tym sposobem nie działa wywoływanie metod poprzez scope operator ::
JoShiMa
W klasie dziedziczącej po prostu $this->polaczenie(); Przecież ona dziedziczy tę metodę od klasy nadrzędnej.
_bezimienny
ok, dzięki

Jeszcze jedno co do Twojego kodu...
  1. <?php
  2. mysql_query("set names 'latin2'");
  3. ?>

To ustawiasz polskie litery? W bazie ustawiasz latin2?
Bo właśnie mam problem z polskimi znakami.
JoShiMa
Tak wymuszam by zapis i odczyt był w ISO, bo dokument html też mam w ISO
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.