Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klasą do mysql
Forum PHP.pl > Forum > PHP > Object-oriented programming
Kas
Ostatnio mało bywałem na forum, ponieważ min. tworzyłem [usunąłem linka] alek.
Ale nie w tym problem. biggrin.gif
Stworzyłem klasę do obsługi bazy danych mysql.

  1. <?php
  2. class sql {
  3. private $link;
  4. private $result;
  5. public $rows;
  6.  
  7. public function __construct {
  8.  
  9. $this -> $sql_host = 'localhost'; // Adres serwera bazy danych
  10. $this -> $sql_name = 'forum'; // Nazwa bazy danych
  11. $this -> $sql_user = 'root'; // Nazwa usera
  12. $this -> $sql_password = ''; // Hasło
  13. $this -> $sql_port = '3306'; // Port
  14.  
  15. $this -> link = mysql_connect($this -> $sql_host, $this -> $sql_user, $this -> $sql_password);
  16. if (!is_resource($this -> link) {
  17. die('Brak połączenia z bazą danych.' . mysql_error());
  18. }
  19. }
  20.  
  21. public function __destruct () {
  22. if(is_resource($this -> link)) {
  23. mysql_close($this -> link);
  24. }
  25. }
  26.  
  27. public function query($query) {
  28.  $this -> result = mysql_query($query, $this -> link);
  29.  }
  30.  
  31. public function fetch_row() {
  32.  if($this -> rows = mysql_fetch_row($this -> result)){
  33. return 1;
  34. }
  35. }
  36. }
  37. ?>


I nie działa. sad.gif
Cały kod wygląda tak.

  1. <?php
  2.  
  3. class sql {
  4. private $link;
  5. private $result;
  6. public $rows;
  7.  
  8. public function __construct {
  9.  
  10. $this -> $sql_host = 'localhost'; // Adres serwera bazy danych
  11. $this -> $sql_name = 'forum'; // Nazwa bazy danych
  12. $this -> $sql_user = 'root'; // Nazwa usera
  13. $this -> $sql_password = ''; // Hasło
  14. $this -> $sql_port = '3306'; // Port
  15.  
  16. $this -> link = mysql_connect($this -> $sql_host, $this -> $sql_user, $this -> $sql_password);
  17. if (!is_resource($this -> link) {
  18. die('Brak połączenia z bazą danych.' . mysql_error());
  19. }
  20. }
  21.  
  22. public function __destruct () {
  23. if(is_resource($this -> link)) {
  24. mysql_close($this -> link);
  25. }
  26. }
  27.  
  28. public function query($query) {
  29.  $this -> result = mysql_query($query, $this -> link);
  30.  }
  31.  
  32. public function fetch_row() {
  33.  if($this -> rows = mysql_fetch_row($this -> result)){
  34. return 1;
  35. }
  36. }
  37. }
  38.  
  39. $sql = new sql;
  40. $sql -> $query('SELECT username FROM users');
  41.  
  42. while($sql -> fetch_row()){
  43. echo '<li>'.$sql -> rows[0].'</li>';
  44. }
  45. echo '</ul>';
  46.  
  47. ?>


Co jest źle?
mike
1. Po jakie licho wstawiłeś ten sam kod dwa razy? Nie można było wstawić kody klasy, a potem kodu, który z nij korzysta :?:
2. Pisząc "nie działa" napisz coś więcej. Nadworny Jasnowidz forum jest na urlopie i ludzie nie będą się domyślać. Jeżeli chcesz uzyskać odpowiedź, włóż w pytanie trocę więcej wysiłku.
dr_bonzo
Co to jest? $this -> $sql_host
Usun '$' sprzed nazw pol:
$this ->sql_host
a poza tym je zadeklaruj i wlacz wyswietlanie bledow
error_reporting( E_ALL );
pies
Ja bym jeszcze zrobił tak:

  1. <?php
  2.  
  3. public function __construct 
  4. {
  5. $this -> sql_host = 'localhost'; // Adres serwera bazy danych
  6. $this -> sql_name = 'forum'; // Nazwa bazy danych
  7. $this -> sql_user = 'root'; // Nazwa usera
  8. $this -> sql_password = ''; // Hasło
  9. $this -> sql_port = '3306'; // Port
  10. }
  11.  
  12. public function connect()
  13. {
  14. $this -> link = mysql_connect($this->sql_host, $this->sql_user, $this->sql_password);
  15. if (!is_resource($this -> link) {
  16. die('Brak połączenia z bazą danych.' . mysql_error());
  17. }
  18. }
  19.  
  20. [..]
  21.  
  22. public function query($query) 
  23. {
  24. if (!$this->link) $this->connect();
  25.  
  26. $this -> result = mysql_query($query, $this -> link);
  27. }
  28. ?>


Dzięki temu nie marnujesz czasu na łączenie się z bazą jeżeli akurat zdarzy się strona która z niej nie korzysta (lub na przykład skrypt się wysypie). Przy pisaniu skryptów pod www dobrze jest pamiętać, że nic nie robi się na zapas, bo wszystkie zapasy znikają razem z requestem.

Po drugie dobrze jest nie robić za dużo w konstruktorze klasy.
Kas
@mike_mech

1) Przepraszam za podwójne podanie kodu. Tak jakoś wyszło. biggrin.gif

2) Napisałbym więcej na temat nie działania jakby więcej wiedział. Mam włączone błędy, mimo to pojawia się poprostu pusta strona.

3) Pozdrów ode mnie Nadwornego Jasnowidza. biggrin.gif

@pies

1) Skrypt na 100% będzie potrzebował połączenie z bazą danych.

@all

Czy wogóle jest sens dawać konstruktor/destruktor?
Może lepiej dać wszystko w postaci zwykłych funkcji?

---

Trochę zmieniełem. Efekt ten sam.

  1. <?php
  2. class sql {
  3. private $link;
  4. private $result;
  5. public $rows;
  6.  
  7. public function __construct() {
  8.  
  9. $this -> sql_host = 'localhost'; // Adres serwera bazy danych
  10. $this -> sql_name = 'forum'; // Nazwa bazy danych
  11. $this -> sql_user = 'root'; // Nazwa usera
  12. $this -> sql_password = ''; // Hasło
  13. $this -> sql_port = '3306'; // Port
  14.  
  15. $this -> link = mysql_connect($this -> sql_host, $this -> sql_user, $this -> sql_password);
  16. if (!is_resource($this -> link) {
  17. die('Brak połączenia z bazą danych.' . mysql_error());
  18. }
  19. }
  20.  
  21. public function __destruct() {
  22. if(is_resource($this -> link)) {
  23. mysql_close($this -> link);
  24. }
  25. }
  26.  
  27. public function query($query) {
  28.  $this -> result = mysql_query($query, $this -> link);
  29.  }
  30.  
  31. public function fetch_row() {
  32.  if($this -> rows = mysql_fetch_row($this -> result)){
  33. return 1;
  34. }
  35. }
  36. }
  37. ?>
nospor
1) nie wybierasz bazy danych
2) zjadles nawias

tak ma byc:
  1. <?php
  2.  
  3. //...
  4. mysql_select_db($this -> sql_name);
  5. if (!is_resource($this->link)) {
  6. die('Brak połączenia z bazą danych.' . mysql_error());
  7. }
  8. //...
  9.  
  10. ?>


pozaym jak robisz: $this -> sql_host
to zadeklaruj tą zmienną: private $sql_host; podobnie reszta
Kas
Działa cudowanie.

  1. <?php
  2. class sql {
  3. private $link;
  4. private $result;
  5. public $rows;
  6.  
  7. public function __construct() {
  8.  
  9. $this -> sql_host = 'localhost'; // Adres serwera bazy danych
  10. $this -> sql_name = 'forum'; // Nazwa bazy danych
  11. $this -> sql_user = 'root'; // Nazwa usera
  12. $this -> sql_password = ''; // Hasło
  13. $this -> sql_port = '3306'; // Port
  14.  
  15. $this -> link = mysql_connect($this -> sql_host, $this -> sql_user, $this -> sql_password);
  16. mysql_select_db($this -> sql_name);
  17. if (!is_resource($this -> link)) {
  18. die('Brak połączenia z bazą danych.' . mysql_error());
  19. }
  20. }
  21.  
  22. public function __destruct() {
  23. if(is_resource($this -> link)) {
  24. mysql_close($this -> link);
  25. }
  26. }
  27.  
  28. public function query($query) {
  29.  $this -> result = mysql_query($query, $this -> link);
  30.  }
  31.  
  32. public function fetch_row() {
  33.  if($this -> rows = mysql_fetch_row($this -> result)){
  34. return 1;
  35. }
  36. }
  37. }
  38. ?>


Będę jeszcze ulepszał. Następne pytania postaram się dać w tym topicu, więc proszę na razie nie usuwać

---

Wielkie podziękowania dla nospora! biggrin.gif

---

Kiedy uruchamia się destruktor? Czy w momencie wykonania skryptu?

Cytat
Natomiast co do destruktora... tego w ogóle nie wywoływaliśmy, zarówno jawnie, jak i niejawnie, a mimo to napis "Wywołanie destruktora" się pojawił. Co jest więc grane? Ano po prostu php w momencie kończenia pracy skryptu niszczył po kolei wszystkie obiekty, dla każdego z nich uruchamiając destruktor (o ile takowy istniał).


To oznacza, że skrypt z destruktorem będzie mi zawsze po wykonaniu się zrywał połączenie z bazą danych?
dr_bonzo
Cytat
To oznacza, że skrypt z destruktorem będzie mi zawsze po wykonaniu się zrywał połączenie z bazą danych?

Tak.
Kas
W takim razie muszę stworzyć zwykłą funkcją zamiast destruktora aby nie zamykać połączenia?
dr_bonzo
Ale po co ci otwarte polaczenie po zakonczeniu skryptu, szczegolnie ze uzywasz mysql_connect (a nie *_pconnect).

Destruktor uruchamia sie przed zniszczeniem obiektu (ktory posiada ten destruktor). Obiekty sa niszczone automatycznie tuz przed zakonczeniem wykonywania skryptu (mozna to tez recznie robic).
Kas
Czy jak mam skrypt, który pobiera dane z bazy to po pobraniu wszystkich danych, wykonaniu wszytskich poleceń oraz wsyświetleniu wszystkich danych połączenie będzie zrywane i przy wejściu w dowolną podstronę będzie tworzone ponownie?

---

Próbuję ulepszyć klasę. Co jeszcze należy zmienić?

  1. <?php
  2. class sql {
  3.  
  4. private $link;
  5. private $result;
  6. public $rows;
  7.  
  8. public function __construct {
  9. $this -> sql_host = 'localhost'; // Adres serwera bazy danych
  10. $this -> sql_name = 'cms'; // Nazwa bazy danych
  11. $this -> sql_user = 'root'; // Nazwa usera
  12. $this -> sql_password = ''; // Hasło
  13. $this -> sql_port = '3306'; // Port
  14. }
  15.  
  16. public function connect() {
  17. $this -> link = mysql_connect($this -> sql_host, $this -> sql_user, $this -> sql_password);
  18. mysql_select_db($this -> sql_name);
  19. if (!is_resource($this -> link)) {
  20. die('Brak połączenia z bazą danych.' . mysql_error());
  21. }
  22. }
  23.  
  24. public function exit() {
  25. mysql_close($this -> link);
  26. }
  27.  
  28. public function query($query) {
  29.  $this -> result = mysql_query($query, $this -> link);
  30.  }
  31.  
  32. public function fetch_row() {
  33.  if($this -> rows = mysql_fetch_row($this -> result)){
  34. return 1;
  35. }
  36. }
  37. }
  38. ?>
eS...
witam
dopiero zakupilem ksiazke o programowaniu oo w php5. I wlasnie skonczylem przerabiac rozdzial z polaczeniami smile.gif . W zwiazku z tym mam pytanko tongue.gif
czy
  1. <?php
  2.  
  3.  public function __construct {
  4. $this -> sql_host = 'localhost'; // Adres serwera bazy danych
  5. $this -> sql_name = 'cms'; // Nazwa bazy danych
  6. $this -> sql_user = 'root'; // Nazwa usera
  7. $this -> sql_password = ''; // Hasło
  8. $this -> sql_port = '3306'; // Port
  9. }
  10. ?>

ten konstruktor jest potrzebny? czy nie lepiej trzymac ustwaienia w jakims pliku conf.php ? przeciez po require bedziemy miali dostep do tych ustawien. A i tak w konstruktorze nie wywolywane jest polaczenie. Moim zdaniem konstruktor jest zbedny smile.gif ale moze dlatego ze nie zaszedlem daleko w tej ksiazce
oizdrawuan
NuLL
A dlaczego nie zestawiać połączenia w konstruktorze ? Gdzieś zakazali questionmark.gif
To czy dane połaczenia będą w osobnym pliku ( jak ja robię ), czy może w stałych a może na sztywno w konstruktorze to tylko kwestia upodobań programisty - nic innego. Przepraszam za lekki OT.

Nie robić OT dot połączeń z SQL-em bo zamkne
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.