Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa bazy danych
_bezimienny
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

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


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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
JoShiMa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

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


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.

Ten post edytował _bezimienny 3.07.2008, 10:59:43
Go to the top of the page
+Quote Post
JoShiMa
post
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

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


Do czego takiego dokładnie zmierzam (IMG:http://forum.php.pl/style_emoticons/default/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?

Ten post edytował _bezimienny 3.07.2008, 11:25:56
Go to the top of the page
+Quote Post
JoShiMa
post
Post #6





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #7





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

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


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 ::
Go to the top of the page
+Quote Post
JoShiMa
post
Post #8





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


W klasie dziedziczącej po prostu $this->polaczenie(); Przecież ona dziedziczy tę metodę od klasy nadrzędnej.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

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


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.
Go to the top of the page
+Quote Post
JoShiMa
post
Post #10





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Tak wymuszam by zapis i odczyt był w ISO, bo dokument html też mam w ISO
Go to the top of the page
+Quote Post

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: 22.08.2025 - 22:40