Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z klasą do mysql
Kas
post
Post #1





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

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


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?


--------------------
nospor, jestem z Wami.
Alpha IT
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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 );


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
pies
post
Post #4





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 9.09.2005
Skąd: Sopot, Polska

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


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.


--------------------
Michał Tatarynowicz, Sputnik!
Go to the top of the page
+Quote Post
Kas
post
Post #5





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

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


@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. ?>


Ten post edytował Kas 15.09.2005, 16:56:20


--------------------
nospor, jestem z Wami.
Alpha IT
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Kas
post
Post #7





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

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


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?

Ten post edytował Kas 15.09.2005, 17:19:05


--------------------
nospor, jestem z Wami.
Alpha IT
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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

Tak.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Kas
post
Post #9





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

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


W takim razie muszę stworzyć zwykłą funkcją zamiast destruktora aby nie zamykać połączenia?


--------------------
nospor, jestem z Wami.
Alpha IT
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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).


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Kas
post
Post #11





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

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


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. ?>


Ten post edytował Kas 15.09.2005, 22:00:03


--------------------
nospor, jestem z Wami.
Alpha IT
Go to the top of the page
+Quote Post
eS...
post
Post #12





Grupa: Zarejestrowani
Postów: 367
Pomógł: 2
Dołączył: 4.03.2003
Skąd: C:/Windows/Temp

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


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


--------------------
Go to the top of the page
+Quote Post
NuLL
post
Post #13





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


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


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 10:02