Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: połączenie klas w jeden system
Forum PHP.pl > Forum > PHP > Object-oriented programming
Mariner
Witam .

Chcę stworzyć aplikację która ma pokazywać zawartość dowolnej bazy danych Mysql.
Aplikację można będzie sprzęgnąć z dowolną bazą danych mysql , w trzech krokach
użytkownik poda dane potrzebne do utworzenia połączenia , wybierze nazwę bazy danych , i nazwę interesującej go tableli , aplikacja wyświetli zawartość tabeli w formie tabeli HTML
czyli nazwy poszczególnych pól jako pierwszy wiersz , każdy następny wiersz będzie opowiadał
wartościom tych pól w bazie danych .

mam klasy takie jak :
db -> łączy się z serwerem baz danych , pobiera listę baz i przechowuje w tablicy
indeksowanej , pobiera listę tabel w wybranej przez użytkownika (za pomocą
odpowiedniej metody) danych i przechowuje w tablicy indeksowanej .

db_table-> korzystając z obiektu db , zbiera informacje o wybranej przez użytkownika tabeli ,
czyli liczba wierszy , liczba pól w jednym wierszu , informacje o poszczególnych
polach , typ danych itp , oraz wartości poszczególnych pól .

table -> korzystając z informacji przetrzymywanych w obiekcie db_table , klasa ta drukuje
tablice HTML , w pierszym wierszu drukuje nazwy poszczególnych pól a w następnych
wierszach ich zawartość .


Problem polega na tym że :

- nie wiem jak połączyć te klasy w jeden działający system , czy może utworzyć klasę np.
system która będzie zarządzała obiektami poszczególnych klas i wyświetlała ich zawartość
w odpowiednim momencie ?

- czy dla każdej akcji odbywającej się w systemie ( np. podanie danych potrzebnych połączenia
z bazą) tworzy się odpowiednią klasę ?

- czy tak napisać klasy aby każda działała w każdym kroku czyli logowanie do serwera baz
danych to jedna klasa , wyświetlanie listy dostępnych baz druga klasa , wyświetlanie listy tabel
to następna klasa , i w końcu wyświetlanie tabel z bazy danych to ostatnia klasa .

- jak rozwiązać problem aby nie wpisywać danych potrzebnych do połączenia z serwerem baz
danych z każdym razem kiedy się wrócę i będę chciał zobaczyć dane innej bazy danych
czy rozwiązaniem jest ustanowienie sesji ?

Z góry dziękuję z podpowiedzi .
bim2
Nie rozumiem do końca o co chodzi. Wnioskuje, że to ma być coś pdobnego do phpmyadmin, że wpisujesz nazwe tabeli i wyświetla ci się tabelka HTML. Nie wiesz jak użyć?

Jeśli nie chcesz przy każdym wywołaniu klasy db, która się łaćzy możesz zdefiniować zmienne w klasie, ale wystarczy chyba 1 połączenie? Robisz 1 połaczenie i dla klasy db_table dajesz np $this->setInstanceDb(new Db); i później cała klasa miałaby z tego korzystać.

Opisz dokładniej co chcesz zrobić? smile.gif
Mariner
Cytat(bim2 @ 24.08.2007, 15:27:14 ) *
Nie rozumiem do końca o co chodzi. Wnioskuje, że to ma być coś pdobnego do phpmyadmin, że wpisujesz nazwe tabeli i wyświetla ci się tabelka HTML. Nie wiesz jak użyć?

Jeśli nie chcesz przy każdym wywołaniu klasy db, która się łaćzy możesz zdefiniować zmienne w klasie, ale wystarczy chyba 1 połączenie? Robisz 1 połaczenie i dla klasy db_table dajesz np $this->setInstanceDb(new Db); i później cała klasa miałaby z tego korzystać.

Opisz dokładniej co chcesz zrobić? smile.gif


Zgadza się , chcę zrobić aplikację na wzór phpmyadmin z tym że zamiast możliwości edycji danych , jak jest to w phpmyadmin , mi wystarczy przeglądnięcie zawartości w przystępnej formie np. tabeli html .

W phpmyadmin dotarcie do konkretnej tabeli zajmuje trzy kroki ,
- podanie danych do logowania
- wybranie bazy danych
- wybranie tabeli aktualnej bazy danych

Do tego momentu moja aplikacja powinna działać w taki sam sposób , chcę tylko zamiast możliwości edycji , mieć podgląd w zawartość w formie tabeli html .

Reszta jak wyżej , mam trzy klasy ... , jak je teraz ładnie zaimplementować w jeden system ,
chodzi o to że chcę to zrobić tak jak powinno to wyglądać w fachowej aplikacji , nie po swojemu
na " dziko " tylko zgodnie z "duchem obiektów" że się tak wyrażę .
Czyli jak rozwiązał by to doświadczony programista ?
Dziękuję z góry za odpowiedzi i sugestie .
Załączam moje klasy , ZAZNACZAM że jeszcze ich nie dokończyłem i nie będą działały ,
ze szczegółami implementacji poradzę sobie sam , klasy mają tylko pokazać sam zamysł
budowy aplikacji i może rozplanowania klas .

  1. <?php
  2. ////////////////////////////////////////////////////
  3. /**
  4.  * Klasa zbiera informacje o bazie danych 
  5.  * */
  6.  
  7. class db {
  8. /**Przechowuje nazwę hosta */
  9. private $sHost ;
  10.  
  11. /**Przechowuje nazwę użytkownika */
  12. private $sUser ;
  13.  
  14. /**Przechowuje hasło dostępu */
  15. private $sPass ;
  16.  
  17. /**Przechowuje identyfikator połączenia z bazą danych*/
  18. private $rLink ;
  19.  
  20. /**Przechowuje listę dostępnych baz danych */
  21. public $aDbList ;
  22.  
  23. /**Przechowuje listę dostępnych w wybranej bazie tabel */
  24. public $aTableList ;
  25.  
  26. public function __construct($host = null , $user = null , $pass = null) {
  27. $this->sHost = $host ;
  28. $this->sPass = $pass ;
  29. $this->sUser = $user ;
  30.  
  31.  
  32. $this->connect($host,$user,$pass) ;
  33. $this->getDbList() ;
  34. }
  35.  
  36.  
  37. /**Zwraca indentyfikator połączenia */
  38. private function connect() {
  39. $this->rLink = mysql_connect($this->sHost,$this->sUser,$this->sPass) ;
  40. }
  41.  
  42. /**Zwraca listę dostępnych baz danych*/
  43. private function getDbList() {
  44. $rDbList = mysql_list_dbs($this->rLink ) ;
  45. while ($row = mysql_fetch_object($rDbList)) {
  46. $this->aDbList[] = $row->Database ;
  47. } 
  48. }
  49.  
  50. /**Pobiera listę tabel z bazy MySQL*/
  51. public function getTableList ($sDbName) {
  52. if(isset($sDbName)) {
  53. $result = mysql_list_tables($sDbName , $this->rLink);
  54. while($row = mysql_fetch_row($result)) {
  55. $this->aTableList = $row ;
  56. }
  57. }
  58. }
  59. }
  60. ////////////////////////////////////////////////////////////////////////////////////
  61. /**
  62.  * Klasa zbiera informacje o tableli 
  63. */
  64.  
  65. class db_table {
  66.  
  67. /**Liczba wierszy w tablicy */
  68. public $iNumRows ;
  69.  
  70. /**Liczba pól jednym wierszu */
  71. public $iNumFields ;
  72.  
  73. /**Tablica indeksowana zawierająca obiekty z informacjami o polach */
  74. public $aFieldObject ;
  75.  
  76. /**Tablica indeksowana zawierająca wartości poszczególnych pól w zapytaniu*/
  77. public $aFieldValues ;
  78.  
  79. /**Inicjalizuje funkcje i zmienne */
  80. public function __construct(query $rResult) { 
  81. $this->getNumRows($rResult) ;
  82. $this->getNumFields($rResult) ;
  83. $this->getFieldObject($rResult) ;
  84. $this->getFieldValues($rResult) ;
  85. }
  86.  
  87. /**Pobiera liczbę wierszy zwrócownych w zaptyaniu */
  88. public function getNumRows($db) {
  89. $this->numRows = mysql_num_rows($db->result) ;
  90. }
  91.  
  92. /**Pobiera liczbę pól jednego wiersza zwrócownych w zapytaniu */
  93. public function getNumFields($db) {
  94. $numFields = mysql_num_fields($db->result) ;
  95. $allFields = $numFields * $this->numRows ;
  96. $this->numFields = $allFields / $this->numRows ; 
  97. }
  98.  
  99. /**Pobiera dane pól w postaciu obiektu i zapisuje w tablicy */
  100. public function getFieldObject($db) {
  101. for($i = 0 ; $i < $this->numFields ; $i++) {
  102. $this->fieldObject[$i] = mysql_fetch_field($db->result , $i);
  103. }
  104. }
  105.  
  106. /**Pobiera wartości pól do tablicy indeksowanej */
  107. public function getFieldValues($db) { 
  108. for($i = 0 ; $i < $this->numRows ; $i++) {
  109. $this->fieldValues[$i] = mysql_fetch_row($db->result) ;
  110. }
  111. }
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. * Klasa drukuje tablice w HTML 
  115.  */
  116.  
  117. class table {
  118.  
  119. public function __construct($db_table) {
  120. $this->table($db_table);
  121. }
  122.  
  123. /** Drukuje nazwy kolumn na podstawie przekazanego obiektu klasy db_table->fieldObject*/
  124. public function colNames ($db_table) {
  125. print '<tr>' ; 
  126. for($i = 0 ; $i < $db_table->numFields ; $i++) {
  127.  print '<td>' ;
  128.  print $db_table->fieldObject[$i]->name ;
  129.  print '</td>' ;
  130. } 
  131. print '</tr>' ;
  132. }
  133.  
  134. /**Drukuje wiersze zawierające komórki z treścią */
  135. public function colValues($db_table) {
  136. for($i = 0 ; $i < $db_table->numRows ; $i++) {
  137. print '<tr>' ;
  138. for($j = 0 ; $j < $db_table->numFields ; $j++) {
  139. print '<td> ' ;
  140. print $db_table->fieldValues[$i][$j] ;
  141. print '</td>' ;
  142. }
  143. print '</tr>' ;
  144. }
  145. }
  146. /**Drukuje tablice */
  147. public function table($db_table) {
  148. print '<table width= 100%>' ;
  149. $this->colNames($db_table) ;
  150. $this->colValues($db_table) ;
  151. print '</table>' ;
  152. }
  153. }
  154. //////////////////////////////////////////////////////////////////////////////////////
  155. ?>
bim2
Ja bym to zrobił tak, że klasa db, ma sie tylko łączyć z bazą danych i obsługiwać zapytania. Taka nakładka na funkcję mysql_(). Zaś klasa DbTable ma obsługiwać tabele z bazy danych.
Więc mamy 3 klasy:
- Db
- DbTable
- DbToHtml

I robimy tak:
  1. <?
  2. $oDb = new Db;
  3. $oDb->connect([...]); // <- to gdzies w confingu etc
  4.  
  5. $oDbTable = new DbTable($oDb);
  6.  
  7. $oDbToHtml = new DbToHtml;
  8.  
  9. $oDbToHtml->generateTable($oDbTable->getArray()); //array('tableka_1' => array( wiersz_1 => value_wiersza))
  10. ?>


Tak mniej więcej powinno to wyglądać (moim zdaniem). Jak ktoś ma lepsze pomysły napiszcie winksmiley.jpg

PS. Sorry, że długo nie odpowiadałem ale weekend był ;]
Mariner
Dzięki za uwagę .
Poszperałem trochę i znalazłem coś takiego jak wzorce projektowe a dokładniej wzorzec MVC
. Przyjrzałem się jego przykładowej implementacji i myślę że mógłbym go zastosować w swojej
aplikacji , dobrze myślę ?
Czy architektura w stylu MVC nadaje się do tego typu aplikacji ?
bim2
jak najbardziej.

Może powiem o niej conieco, żeby nie było później pytań.
Najgorsze będzie stworzenie porządnego kontrollera, który to wszystko obsłuży...

Przedstawie Ci jednak tylko ogólny zarys. Masz akcję:
class Action_Index extends Application_Action
{
public function default()
{
$this->getModel('Index', 'getDatabases');
$this->getView('Index', 'showDatabases');
}

}

W klasie Application_Action znajdują się metody getModel() i getView(). W modelu pobierasz dane (musi byc extends Application_Model) i zapisujesz do zmiennej np. $thia->aParametrs['databases'] = array(); (aby sobie uławić możes stworzyć metody __set i __get) w widoku odczytujesz te wartosci i wywolujesz thema.
Sedziwoj
@bim2
nie rozpowszechniaj swojej implementacji tak wszędzie, bo osobiście uważam że albo coś mi umyka z jej działania, albo nie jest ona dobra.
O MVC jest wiele artykułów w tym i na php.pl, poczytaj (choć właśnie na php.pl jest nie wiem czemu wprowadzona zależność modelu od widoku)
bim2
@Sedziwoj
Nie chce jej rozpowszechniać, ale jeżeli nikt tu się nie wpisał, opisałem mój pomysł. Czytałem artykuł na php.pl, tematy w archiwum pro itd. Później przejrzałem Rapide Framework i z niego zaczerpnołem wiedzy.
Jak możesz,powiedz co jej źle z moją implementacją? Kontroller łączy akcje, modele i widoki.
Akcja dba co ma zostać pobrane i jak wyświetlone (czyt. wywołuje modele i widoki).
Dane z modelu do widoku są przekazywane poprzez subkontroller (Application_Action, Application_Model, Application_View) które zapisują dane w aParametrs kontrollera i wtedy każdy model/widok ma dostęp do tych samych danych. Poszedłem jeszcze dalej i zapisuje co uruchomiło co i nigdy model nie uruchomi się 2 razy (moża wymusić włączenie). Dla mnie jest to wygodne, aczkolwiek jeśli mówisz, że jest w tym coś nie tak to poprzeglądam inne FW.
Mówiłem to ja BIM.
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.