Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Problem z klasą
Forum PHP.pl > Forum > Przedszkole
Setesh
Witam.

Mam do was prośbę - chcę wrzucić do klasy wszystkie ważniejsze odwołania do MySQL'a ale mam problem z samą funkcją połączenia się z bazą danych. Nie mogę coś napisać tego. O ile sama funkcja działa o tyle w klasie już coś nie chce. Możecie mi z tym pomóc ? Będę bardzo wdzięczny smile.gif

  1.  
  2. <?php
  3.  
  4. class BazaMySQL
  5. {
  6. // Konstruktor
  7. function BazaMySQL()
  8. {
  9. $this->DB_Connect('Nazwa_bazy'); // Nie chce się odwołać do funkcji :(
  10. }
  11.  
  12. }
  13.  
  14. // Chciałem dodać rozszerzenie do klasy - jako funkcję używaną tylko przez klasę - niestety nie działa :(
  15.  
  16. class BazaMain extends BazaMySQL
  17. {
  18. protected $HostAddr = '127.0.0.1';
  19. protected $UserName = 'baza_admin';
  20. protected $UserPassword = 'baza_password';
  21. protected $UserDefaultDataBase = 'Nazwa_bazy';
  22.  
  23. protected $MYSQL_ERRNO = '';
  24. protected $MYSQL_ERROR = '';
  25.  
  26.  
  27. public function DB_Connect($DataBaseName)
  28. {
  29. global $link_id;
  30. echo "wywolana z<br>";
  31. $link_id = mysql_connect($HostAddr, $UserName, $UserPassword);
  32. if(!$link_id)
  33. {
  34. $MYSQL_ERRNO = 0;
  35. $MYSQL_ERROR = "Connection failed to the host $HostAddr.";
  36. return 0;
  37. }else if(empty($DataBaseName) && !mysql_select_db($UserDefaultDataBase))
  38. {
  39. $MYSQL_ERRNO = mysql_errno();
  40. $MYSQL_ERROR = mysql_error();
  41. return 0;
  42. }else if(!empty($DataBaseName) && !mysql_select_db($DataBaseName))
  43. {
  44. $MYSQL_ERRNO = mysql_errno();
  45. $MYSQL_ERROR = mysql_error();
  46. return 0;
  47. }else return $link_id;
  48. }
  49.  
  50. }
  51. ?>
  52.  
  53.  


Ogólnie to chciałem aby stworzyć bezpieczne logowanie się do serwera mysql i tak aby nikt niepowołany nie mógł wywołać z zewnątrz klasy funkcji DB_Connect - niestety moje starania na nic się nie zdały pomimo iż rozszerzenie klasy jest napisane poprawnie (no może jakiś błąd w deklaracji funkcji w rozszerzeniu klasy)

Ewentualnie jeżeli możecie mi doradzić jak co zmienić aby było bezpieczniejsze i co źle robię w tym przykładzie sad.gif
darko
Mam jedno pytanie: po co Ty to w ogóle robisz skoro możesz wykorzystać (rozszerzyć) gotową klasę PDO będącą już niemal standardem? Poprawne korzystanie z PDO zapewnia lepsze bezpieczeństwo niż kolejna implementacja opakowywania strukturalnego kodu w klasy. W temacie:
- gdzie w klasie BazaMySql masz zdefiniowaną metodę DB_Connect do której się odwołujesz, bo nigdzie jej nie widać?
- dlaczego w klasie bazowej wywołujesz metodę, której definicja znajduje się w klasie wyprowadzonej?
Setesh
O PDO nic nie wiedziałem a po za tym nie wiedziałbym na razie jak to wykorzystać - znalazłem manual o PDO ale trochę mi to zajmie aby się o tym nauczyć.

Odnośnie wywoływania funkcji... Ok jestem nowy w php ale nigdzie w przykładach nie widziałem aby wcześniej było trzeba deklarować funkcję będącą poza klasą główną - zawsze było coś w stylu Funk1(){..}, funk2(){...} i w rozszerzeniu była funk3(){...}. więc nie wiem jak to w php zrobić sad.gif
darko
blinksmiley.gif Ok, to inaczej - gdzie w klasie BazaMySQL znajduje się metoda, którą wywołujesz w konstruktorze poprzez wywołanie $this->DB_Connect('Nazwa_bazy');? Nie można odwołać się do czegoś, co jeszcze nie istnieje.
// edit
a dziedziczymy z góry w dół, gdzie góra to klasa bazowa, a dół to klasa najbardziej wyprowadzona:

bazowa <------ Ty tu wywołujesz metodę, która...
|
wyprowadzona1 <----- ... znajduje się tutaj
|
wyprowadzona2
Setesh
Znaczy się tak : ? (nie mam obecnie dostępu so php i mysql na tym komputerze - jestem poza domem)

  1.  
  2. <?php
  3.  
  4. class BazaMySQL
  5. {
  6. public function DB_Connect($DataBaseName); // deklaracja funkcji
  7. // Konstruktor
  8. function BazaMySQL()
  9. {
  10. $this->DB_Connect('Nazwa_bazy'); // Nie chce się odwołać do funkcji :(
  11. }
  12.  
  13. }
  14.  
  15. class BazaMain extends BazaMySQL
  16. {
  17. protected $HostAddr = '127.0.0.1';
  18. protected $UserName = 'baza_admin';
  19. protected $UserPassword = 'baza_password';
  20. protected $UserDefaultDataBase = 'Nazwa_bazy';
  21.  
  22. protected $MYSQL_ERRNO = '';
  23. protected $MYSQL_ERROR = '';
  24.  
  25.  
  26. public function DB_Connect($DataBaseName)
  27. {
  28. global $link_id;
  29. echo "wywolana z<br>";
  30. $link_id = mysql_connect($HostAddr, $UserName, $UserPassword);
  31. if(!$link_id)
  32. {
  33. $MYSQL_ERRNO = 0;
  34. $MYSQL_ERROR = "Connection failed to the host $HostAddr.";
  35. return 0;
  36. }else if(empty($DataBaseName) && !mysql_select_db($UserDefaultDataBase))
  37. {
  38. $MYSQL_ERRNO = mysql_errno();
  39. $MYSQL_ERROR = mysql_error();
  40. return 0;
  41. }else if(!empty($DataBaseName) && !mysql_select_db($DataBaseName))
  42. {
  43. $MYSQL_ERRNO = mysql_errno();
  44. $MYSQL_ERROR = mysql_error();
  45. return 0;
  46. }else return $link_id;
  47. }
  48.  
  49. }
  50. ?>


Jeżeli tak to czy aby ta funkcja mogła być wywołana tylko z klasy głównej z konstruktora to nie powinienem ustawić jej jako protected lub jako private ?
darko
sześć kwestii:
1. po co definiujesz metodę DB_Connect w klasie BazaMySQL i wywołujesz ją w konstruktorze skoro dalej w klasie potomnej ją nadpisujesz, czemu to ma służyć?
2. w konstruktorze klasy wyprowadzonej (którego nie zdefiniowałeś) wywołaj konstruktor klasy nadrzędnej (parent::__construct)
3. po co Ci dwie klasy do obsługi tej implementacji, którą tu uskuteczniasz, nie wystarczy jedna?
4. poczytaj o podstawach obiektowego programowania bo widzę, że się gubisz
5. nie używaj globali, przekazuj zmienne w parametrach metod lub konstruktorów
6. skorzystaj jednak z PDO nadpisując klasę bazową albo w ogóle jej nie nadpisuj, ale naucz się z niej korzystać i z pewnością wyjdzie Ci to na dobre.
Owocnej nauki.
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.