Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] Problem z klasą
Setesh
post
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/sad.gif)

Ten post edytował Setesh 29.01.2011, 23:41:35
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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ć (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


(IMG:style_emoticons/default/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

Ten post edytował darko 30.01.2011, 00:27:44
Go to the top of the page
+Quote Post
Setesh
post
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 2.10.2006
Skąd: Wrocław

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


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 ?
Go to the top of the page
+Quote Post
darko
post
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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.
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: 23.12.2025 - 02:47