Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Prosta obiektówka
Forum PHP.pl > Forum > Przedszkole
Dual Jack
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.
Szymciosek
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->
Dual Jack
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ę.
Szymciosek
A proszę ja Cię bardzo biggrin.gif
!*!
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).
Szymciosek
Teraz to mi zamieszałeś !*!.
Myślałem, że Funkcja == Metoda.
Jak to jest?
skleps
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...

Szymciosek
Jakiś przykład?
Dual Jack
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ę.
Thorang Hoog
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. ?>
skleps
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
matiit
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
skleps
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
webmaniak
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.
markonix
Cytat(webmaniak @ 12.04.2013, 19:09:18 ) *
Możesz rozwinąć o co Ci chodzi?

http://pl.wikipedia.org/wiki/Metoda_statyczna
webmaniak
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
skleps
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...


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.