Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Prosta obiektówka, za chwilę zwariuję..
Dual Jack
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 1
Dołączył: 9.08.2010

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


Witam!

Napisałem sobie bardzo prosty skrypcik połączenia z bazą danych.

Funkcja sql() tworzy obiekt łączący się z bazą danych oraz wysyła zapytanie sql.

Wszystko cacy, ale występuje jakiś nielogiczny błąd. Może Wy znajdziecie przyczynę:

  1.  
  2. public $host = "localhost";
  3. public $user = "root";
  4. public $pass = "password";
  5. public $db_name = "test";
  6.  
  7. public function __construct($host,$user,$pass,$db_name){
  8. echo $db_name; // nic nie zwraca?!
  9. $connect = mysql_connect($host,$user,$pass);
  10. $database = mysql_select_db($db_name);
  11. mysql_query("SET NAMES utf8");
  12. $return_error = "<h1>Błąd połączenia z bazą danych</h1>";
  13. if($connect) return TRUE;[u] else die($return_error)[/u];
  14. }
  15.  
  16. public function query($query){
  17. $results = mysql_query($query) or die(mysql_error());
  18. return $results;
  19. }
  20.  
  21. }
  22.  
  23. function sql($sql){
  24. $db = new mysql_connect;
  25. $db -> query($sql);
  26. }
  27.  
  28. sql("SELECT * FROM blog");



Po uruchomieniu strony, uruchamia się instrukcja die() i zwraca mi ona słowa:
"No database selected".

Chodzi o to, że zmienna $db_name nie przechodzi do wnętrza metody obiektu. Dla czego? Jakim cudem?

Proszę o pomoc.

Ten post edytował Dual Jack 11.04.2013, 18:43:27
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Szymciosek
post
Post #2





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Sprawa 1) Czemu ma przejść? Skoro ich nawet nie przekazujesz... masz na sztywno ustawione wartości zmiennych publicznych, a w konstruktorze i tak się spodziewasz podania 4 zmiennych, więc masz do wyboru:
a)
  1.  
  2. public $host = "localhost";
  3. public $user = "root";
  4. public $pass = "password";
  5. public $db_name = "test";
  6.  
  7. public function __construct(){
  8. echo $db_name; // nic nie zwraca?!
  9. $connect = mysql_connect($this->host,$this->user,$this->pass);
  10. $database = mysql_select_db($this->db_name);
  11. mysql_query("SET NAMES utf8");
  12. $return_error = "<h1>Błąd połączenia z bazą danych</h1>";
  13. if($connect) return TRUE;[u] else die($return_error)[/u];
  14. }
  15.  
  16. public function query($query){
  17. $results = mysql_query($query) or die(mysql_error());
  18. return $results;
  19. }
  20.  
  21. }
  22.  
  23. function sql($sql){
  24. $db = new mysql_connect;
  25. $db -> query($sql);
  26. }
  27.  
  28. sql("SELECT * FROM blog");


b )
  1.  
  2. public function __construct($host,$user,$pass,$db_name){
  3. echo $db_name; // nic nie zwraca?!
  4. $connect = mysql_connect($host,$user,$pass);
  5. $database = mysql_select_db($db_name);
  6. mysql_query("SET NAMES utf8");
  7. $return_error = "<h1>Błąd połączenia z bazą danych</h1>";
  8. if($connect) return TRUE;[u] else die($return_error)[/u];
  9. }
  10.  
  11. public function query($query){
  12. $results = mysql_query($query) or die(mysql_error());
  13. return $results;
  14. }
  15.  
  16. }
  17.  
  18. function sql($sql){
  19. $db = new mysql_connect('localhost', 'root', 'password', 'test');
  20. $db -> query($sql);
  21. }
  22.  
  23. sql("SELECT * FROM blog");


2) W 18 linii używasz mysql_error... czemu nie zrobisz tego samego w 14 linii? die(mysql_error);

3) nie używa się już mysql_connect tylko PDO.

Rada od wujka Szymka - weź się za podstawy, a później pisz takie klasy czy coś. W OOP często używa się do najprostszych rzeczy $this->

Ten post edytował Szymciosek 11.04.2013, 19:06:30
Go to the top of the page
+Quote Post
Dual Jack
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 1
Dołączył: 9.08.2010

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


Dziękuję Ci, Szymciosek, za łopatologiczne wyjaśnienie problemu.

W PHP programuję już kilka lat ( raczej amatorsko ) i wstyd mi się przyznać, że dopiero teraz podjąłem się obiektówki ( niektórzy mówią, że lepiej później niż wcale ).

Postanowiłem, własnie jako moją pierwszą klasę, napisać skrypt do bazy danych, stąd tak głupie błędy.

Możliwe, że jeszcze nie do końca rozumiem, jak to działa( myślałem, że __construct() bierze sobie zmienne z klasy )

Jeszcze raz bardzo Ci dziękuję.

Ten post edytował Dual Jack 11.04.2013, 19:22:57
Go to the top of the page
+Quote Post
Szymciosek
post
Post #4





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


A proszę ja Cię bardzo biggrin.gif
Go to the top of the page
+Quote Post
!*!
post
Post #5





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(Dual Jack @ 11.04.2013, 20:18:11 ) *
Możliwe, że jeszcze nie do końca rozumiem, jak to działa( myślałem, że __construct() bierze sobie zmienne z klasy )

Podejdź co metod jak do funkcji, w gruncie rzeczy działają podobnie. Do funkcji też musisz coś przekazać, aby móc z tego później korzystać, chyba że to wcześniej ustalisz.

  1. public $login;
  2. public function connect($login = 'mojlogin', $haslo='pass', $port){ //to metoda
  3. $this->login = $login; // jak nie przekazujemy w instancji zadnego loginu, domyslnie bedzie to 'mojlogin'


Co oczywiście nie powinno się brać znikąd. Ale domyśle wartości czasami się przydają.

@Szymciosek - poprawiłem, a metoda != funkcja, bo funkcja nie ma $this i nie może niczego przepisać poza swoje ciało (a raczej nie powinna).

Ten post edytował !*! 11.04.2013, 19:41:01


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Szymciosek
post
Post #6





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Teraz to mi zamieszałeś !*!.
Myślałem, że Funkcja == Metoda.
Jak to jest?
Go to the top of the page
+Quote Post
skleps
post
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


Cytat(Szymciosek @ 11.04.2013, 20:36:16 ) *
Teraz to mi zamieszałeś !*!.
Myślałem, że Funkcja == Metoda.
Jak to jest?


Funkcja to mniej więcej metoda - różnica polega na danych na jakich operuje...

Go to the top of the page
+Quote Post
Szymciosek
post
Post #8





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

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


Jakiś przykład?
Go to the top of the page
+Quote Post
Dual Jack
post
Post #9





Grupa: Zarejestrowani
Postów: 11
Pomógł: 1
Dołączył: 9.08.2010

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


skleps miał chyba na myśli to, że zmienne w metodzie można pobrać z zewnątrz metody ( ale z wewnątrz klasy ), a funkcja pobiera zmienne tylko z tych definiowanych w nawiasach () - o ile dobrze teraz rozumiem obiektówkę.
Go to the top of the page
+Quote Post
Thorang Hoog
post
Post #10





Grupa: Zarejestrowani
Postów: 41
Pomógł: 9
Dołączył: 8.02.2009

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


Metoda jest funkcją dotyczącą konkretnej klasy. funkcje możesz wywołać w całym skrypcie. A metody tylko gdy masz zdeklarowaną klasę lub/i egzemplarz obiektu danej klasy.

  1. <?PHP
  2. class klasa {
  3. private $zmenna = false;
  4. public static function testuj (){
  5. echo "OK";
  6. return true;
  7. }
  8.  
  9. protected function inna_metoda (){
  10. $this -> testuj (); // wywołanie metody w obrębie tego samego obiektu
  11. // $this jest zmienną która reprezentuje dany obiekt
  12. $this -> zmienn = true; // zapis do zmiennej obiektu
  13. }
  14. }
  15. klasa::testuj(); // Wywołanie metody PHP 5.3 bez konieczności utworzenia obiektu
  16. $obiekt = new klasa ();
  17. $obiekt -> testuj();//wywołanie metody na egzemplarzu obiektu klasy "klasa"
  18. ?>


Ten post edytował Thorang Hoog 12.04.2013, 10:25:01
Go to the top of the page
+Quote Post
skleps
post
Post #11





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


Cytat(Dual Jack @ 11.04.2013, 22:39:33 ) *
skleps miał chyba na myśli to, że zmienne w metodzie można pobrać z zewnątrz metody ( ale z wewnątrz klasy ), a funkcja pobiera zmienne tylko z tych definiowanych w nawiasach () - o ile dobrze teraz rozumiem obiektówkę.


Programowanie proceduralne = funkcje są oddzielone od danych, działają na danych podanych w wywołaniu i zwracają jakiś wynik, chociażby TRUE.
Oczywiście są odstępstwa i można w ciele funkcji obrabiać dane które nie zostały podane w wywołaniu funkcji, ale wtedy w php trzeba je jawnie zadeklarować "globalem".

Programowanie obiektowe = dane są "scalone" z funkcjami (nazywamy je wtedy metodami) operującymi na tych danych.
Czyli funkcja (metoda) może w miarę swobodnie operować na danych swojego obiektu.
No i patrząc fanatycznie dane/zmienne danego obiektu powinny być zmieniane wyłącznie przez funkcje(metody) tego obiektu smile.gif
Go to the top of the page
+Quote Post
matiit
post
Post #12





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Cytat
Programowanie proceduralne = funkcje są oddzielone od danych, działają na danych podanych w wywołaniu i zwracają jakiś wynik, chociażby TRUE.
Oczywiście są odstępstwa i można w ciele funkcji obrabiać dane które nie zostały podane w wywołaniu funkcji, ale wtedy w php trzeba je jawnie zadeklarować "globalem".

Programowanie obiektowe = dane są "scalone" z funkcjami (nazywamy je wtedy metodami) operującymi na tych danych.
Czyli funkcja (metoda) może w miarę swobodnie operować na danych swojego obiektu.
No i patrząc fanatycznie dane/zmienne danego obiektu powinny być zmieniane wyłącznie przez funkcje(metody) tego obiektu


Musze to napisać smile.gif
czasem kod używający klas i obiektów może być tak naprawdę proceduralny.
Czasem zaś kod pisany bez obiektów i klas może być obiektowy.

Przykład?
GTK - pisane w C (które nie posiada obiektowości), a mimo to kod jest obiektowy smile.gif
Go to the top of the page
+Quote Post
skleps
post
Post #13





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


Cytat(matiit @ 12.04.2013, 16:22:03 ) *
Musze to napisać smile.gif
czasem kod używający klas i obiektów może być tak naprawdę proceduralny.
Czasem zaś kod pisany bez obiektów i klas może być obiektowy.
Przykład?
GTK - pisane w C (które nie posiada obiektowości), a mimo to kod jest obiektowy smile.gif


Nie mieszaj - wiadomo że w programowaniu wszystko się da, a wyjątków, podpórek i kombinacji jest cała kupa smile.gif
Ale jak ktoś wie mało to na początek niech zapamięta podstawy,
a jak później będzie potrzebował obejść to znajdzie na ten temat odpowiednie info smile.gif


p.s. żeby zamieszać dodatkowo - można też wywoływać metody z obiektu bez tworzenia tego obiektu smile.gif
Go to the top of the page
+Quote Post
webmaniak
post
Post #14





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


Cytat(skleps @ 12.04.2013, 17:03:30 ) *
p.s. żeby zamieszać dodatkowo - można też wywoływać metody z obiektu bez tworzenia tego obiektu smile.gif

Możesz rozwinąć o co Ci chodzi? to nie jest nic wielkiego, sytuacja o której piszesz znajdują się w każdej lekturze o OOP.


Ten post edytował webmaniak 13.04.2013, 07:16:54


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
markonix
post
Post #15





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Cytat(webmaniak @ 12.04.2013, 19:09:18 ) *
Możesz rozwinąć o co Ci chodzi?

http://pl.wikipedia.org/wiki/Metoda_statyczna


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #16





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


Eh, może trzeba było zacytować do końca moją wypowiedź, a nie tylko jej fragment? Wyraźnie napisałem że można o tym przeczytać w każdym kursie o OOP. Czytajcie ze zrozumieniem. Celowo nie pisałem o co chodzi by zainteresować autora tematu do samodzielnego znalezienia odpowiedzi o co chodzi.
Druga sprawa to:
Cytat(webmaniak @ 12.04.2013, 19:09:18 ) *
Możesz rozwinąć o co Ci chodzi?

odnosi się do tego:
Cytat(skleps @ 12.04.2013, 17:03:30 ) *
p.s. żeby zamieszać dodatkowo

Nie wiem w jakim sensie metody statyczne to zamieszanie smile.gif Tyle sprostowań. Jestem na takim etapie że wiem co to metody statyczne, jak i kiedy je stosować smile.gif

Ten post edytował webmaniak 13.04.2013, 07:18:17


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
skleps
post
Post #17





Grupa: Zarejestrowani
Postów: 142
Pomógł: 9
Dołączył: 3.03.2011

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


Cytat(webmaniak @ 13.04.2013, 08:16:03 ) *
Eh, może trzeba było zacytować do końca moją wypowiedź, a nie tylko jej fragment? Wyraźnie napisałem że można o tym przeczytać w każdym kursie o OOP. <cut>
Nie wiem w jakim sensie metody statyczne to zamieszanie smile.gif Tyle sprostowań. Jestem na takim etapie że wiem co to metody statyczne, jak i kiedy je stosować smile.gif


Zamieszanie DLA ZACZYYNAJĄCEGO smile.gif
A takim chyba jest wątkotwórca...


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: 19.08.2025 - 05:07