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
_bezimienny
post
Post #2





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 #3





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

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 - 18:43