Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kilka klas i baza danych
koxu1996
post 28.04.2013, 12:12:49
Post #1





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


Witam. Posiadam klasę Database:
  1. class Database {
  2.  
  3. public $pdo;
  4. public $mysqlhost = 'localhost';
  5. public $port = '3307';
  6. public $username = 'user';
  7. public $password = 'pass';
  8. public $database = 'database';
  9.  
  10. public function construct() {
  11. try {
  12. $pdo = new PDO('mysql:host='.$mysqlhost.';dbname='.$database.';port='.$port, $username, $password );
  13. echo "połączono!";
  14. } catch(PDOException $e) {
  15. echo 'Nie można połączyć z bazą MySQL!<br />';
  16. }
  17. }
  18.  
  19. }

oraz klasę user która ma w sobie:
  1. $sql = $pdo -> prepare('...');


Najpierw na stronie tworzę element klasy Database żeby połączyło z bazą, a potem używam metody z klasy user. Jednak na stronie zwraca taki błąd:
Fatal error: Call to a member function prepare() on a non-object
Co zrobiłem nie tak? Czyżby nie widziało połączenia z innej klasy? A może każdą klasę mam dziedziczyć po Database?
Go to the top of the page
+Quote Post
klocu
post 28.04.2013, 12:47:31
Post #2





Grupa: Zarejestrowani
Postów: 291
Pomógł: 45
Dołączył: 21.08.2007

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


  1. $pdo = new PDO('mysql:host='.$mysqlhost.';dbname='.$database.';port='.$port, $username, $password );

chyba raczej
  1. $this->pdo


Trochę jednak nielogiczne zamykać PDO w klasie, która będzie jedynie pomostem i przechowywaczem konfiguracji.
Go to the top of the page
+Quote Post
koxu1996
post 28.04.2013, 12:57:57
Post #3





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


Dalej ten sam błąd. Skoro mówisz żeby nie zamykać pdo w klasie to jak inaczej zrobić? Przecież nie będę w każdym pliku dołączał tych samych linijek łączących z bazą
Go to the top of the page
+Quote Post
Wazniak96
post 28.04.2013, 13:18:39
Post #4





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Zrób klasę do obsługi MySQL i ją dziedzicz, lub po prostu przekazuj obiekt PDO jako argument do __construct() a później z niej twórz obiekt private w danej klasie.
Go to the top of the page
+Quote Post
sajegib
post 28.04.2013, 13:24:47
Post #5





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


Cytat("wazniak96")
Zrób klasę do obsługi MySQL i ją dziedzicz, lub po prostu przekazuj obiekt PDO jako argument do __construct() a później z niej twórz obiekt private w danej klasie.


W tym wypadku ani dziedziczenie ani przekazywanie obiektu bazy do klasy nic nie da wink.gif


  1. public function construct() {
  2. try {
  3. $pdo = new PDO('mysql:host='.$mysqlhost.';dbname='.$database.';port='.$port, $username, $password );
  4. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // TEN BLOK CI WYSWIETLI BLEDY PDO
  5. echo "połączono!";
  6. } catch(PDOException $e) {
  7. echo 'Nie można połączyć z bazą MySQL!<br />';
  8. }
  9. }
  10.  


a tak pozatym to do pół w klasie odwołujesz się przez $this->

czyli nie:
  1. $pdo = new PDO('mysql:host='.$mysqlhost.';dbname='.$database.';port='.$port, $username, $password );


tylko


  1. $this->pdo = new PDO('mysql:host='.$this->mysqlhost.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );



pozdrawiam

Ten post edytował sajegib 28.04.2013, 13:25:57
Go to the top of the page
+Quote Post
koxu1996
post 28.04.2013, 13:25:54
Post #6





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


A czy zrobienie połączenia bez zamknięcia w klasie i dołączanie wszędzie to dobre rozwiązanie?
Go to the top of the page
+Quote Post
sajegib
post 28.04.2013, 13:32:09
Post #7





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


obiekt bazy przekazuj do konstruktora klasy korzystającej z DB, tak jak napisał kolega, jednak najpierw zrób działającą klasę bazy wink.gif
Go to the top of the page
+Quote Post
Wazniak96
post 28.04.2013, 14:46:36
Post #8





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Chyba źle się wyraziłem, w każdym razie mniej więcej o to samo mi chodziło. smile.gif
Go to the top of the page
+Quote Post
koxu1996
post 28.04.2013, 18:27:20
Post #9





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


sajegib, dzięki za pomoc. Mam jeszcze pytanko: Czy klasy powinny być od siebie zależne? Tzn jak mam w klasie User wylogowywanie to normalnie niszczyć tam sesje, czy może korzystać z metody zawartej w klasie SessionManager i czy ją dziedziczyć?
Go to the top of the page
+Quote Post
Arcioch
post 28.04.2013, 18:33:35
Post #10





Grupa: Zarejestrowani
Postów: 324
Pomógł: 110
Dołączył: 18.09.2012

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


Jak dla mnie najlepszym rozwiązaniem będzie użycie Singletonu smile.gif
Go to the top of the page
+Quote Post
sajegib
post 28.04.2013, 19:24:34
Post #11





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


Cytat(koxu1996 @ 28.04.2013, 19:27:20 ) *
sajegib, dzięki za pomoc. Mam jeszcze pytanko: Czy klasy powinny być od siebie zależne? Tzn jak mam w klasie User wylogowywanie to normalnie niszczyć tam sesje, czy może korzystać z metody zawartej w klasie SessionManager i czy ją dziedziczyć?



Moim zdaniem stworzyć nową klasę do obsługi sesji, tworzyć w klasie User obiekt klasy session i wywoływać jej metody. np.

  1. //klasa USER
  2. private $session = new session();
  3. //konstruktor
  4. public function logout();{
  5.  
  6. $this->session->destroy_session();
  7. }
Go to the top of the page
+Quote Post
koxu1996
post 3.05.2013, 09:59:20
Post #12





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


Dzięki za pomoc. Mam jeszcze jeden problem z klasą User:
  1. class User {
  2.  
  3. public $all;
  4.  
  5. public function getAll($id, $connection) {
  6. $sql = $connection -> prepare('SELECT * FROM `users` WHERE `user_id` = :id');
  7. $sql -> bindValue(':id', $id, PDO::PARAM_STR);
  8. $sql -> execute();
  9. $this -> all = $sql -> fetchAll();
  10. }
  11.  
  12. public function getName() {
  13. return $this -> all[0]['user_name'];
  14. }
  15.  
  16. public function getEmail() {
  17. return $this -> all[0]['user_email'];
  18. }
  19. }


Gdy używam potem na stronie czegoś takiego:
  1. $user::getName()

To wyskakuje:
Fatal error: Using $this when not in object context
i pokazuje na linię w kórej jest return w metodzie getName

Jak to naprawić?
Go to the top of the page
+Quote Post
sajegib
post 3.05.2013, 18:23:16
Post #13





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


Nie możesz użyć :: (dwa dwukropki), bo ten operator dotyczy metod/pól statycznych

zamień na ->
Go to the top of the page
+Quote Post
koxu1996
post 4.05.2013, 07:07:37
Post #14





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


Dzięki, nigdy bym na to nie wpadł haha.gif Teraz już wszystko funkcjonuje tylko zastanawiam się w jakiej klasie będzie więcej niż jeden obiekt, bo tak to by nie miało sensu. Na pewno klasa z aukcjami, ale co jeszcze na stronie aukcyjnej?
Go to the top of the page
+Quote Post
CuteOne
post 5.05.2013, 11:31:28
Post #15





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


@koxu1996 nie męcz się w wynajdowanie własnych "pseudorozwiązań" bo gdy wynajdziesz nowy problem, znowu zmarnujesz czas na zastanawianie się jak go rozwiązać. Zainteresuj się frameworkami - zend, codeigniter, symfony (na początek polecam CodeIgniter). Budując swoją aplikację na frameworku masz pewność, że prawie każdy problem, został rozwiązany a tobie pozostaje tylko jego odpowiednia implementacja:)
Go to the top of the page
+Quote Post
koxu1996
post 5.05.2013, 14:16:47
Post #16





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


@CuteOne Próbowałem pracować z frameworkiem, ale postanowiłem że najpierw nauczę się programować obiektowo. Nie szukam jakichś pseudo rozwiązań, tylko zastanawiam się jak z sensem użyć oop na stronie aukcyjnej. Na razie pisanie obiektowe dało mi rozdzielenie modelu od widoku oraz przejrzystość kodu, ale poza tym nie widzę wyższości tego nad zrobieniem tego samego na funkcjach. I tak wszystkie klasy mają po jednym obiekcie, a jedynie w aukcjach będzie tworzone wiele obiektów które i tak będą nadpisywane do jednej zmiennej. Chodzi mi tylko o pomoc w wybraniu klas które mam stworzyć (framework tego nie rozwiązuje). Teoretycznie mógłbym zrobić klasę Category i każdą kategorie zrobić jako obiekt, ale po co jak wystarczy tylko jedna pętla po pobraniu z bazy.
Go to the top of the page
+Quote Post
Wazniak96
post 5.05.2013, 15:48:26
Post #17





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


Budujesz powiedzmy klasę aukcja zajmującą się daną jej aukcją. Z właściwości aukcji robisz obiekty, następnie poprzez metody dowolnie edytujesz sb je i możesz jednocześnie pracować na zmodyfikowanych już obiektach bez wysyłania żadnego zapytania np. UPDATE do MySQL. Po zakończeniu działań wykonujesz metodę z zapytaniem UPDATE, które nadpisuje dane aukcji z obiektów. I tym oto sposobem masz jedno zapytanie zamiast kilkudziesięciu. Oczywiście, że da się to zrobić na funkcjach ale gdzie zapiszesz dane? Aby ponownie użyć zbioru tych funkcji musisz mocno ingerować w cały skrypt. Tutaj dołączasz klasę i już praktycznie mało co do roboty. wink.gif
Go to the top of the page
+Quote Post
koxu1996
post 5.05.2013, 18:48:44
Post #18





Grupa: Zarejestrowani
Postów: 139
Pomógł: 3
Dołączył: 5.06.2011

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


@Wazniak96 Sory ale cie nie rozumiem. Czy mógłbyś mi wytłumaczyć to zdanie: "Z właściwości aukcji robisz obiekty" - Właściwości aukcji to pola w klasie, więc jak z nich zrobię obiekty? Następnych zdań to w ogóle nie rozumiem. Jak pracuje na obiektach bez zapytań, jak każda zmiana musi być wysyłana do bazy i na bieżąco pokazywana użytkownikom.
Go to the top of the page
+Quote Post
Wazniak96
post 5.05.2013, 21:00:16
Post #19





Grupa: Zarejestrowani
Postów: 550
Pomógł: 75
Dołączył: 5.06.2012
Skąd: Lębork

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


kurde.. znowu pomieszałem nazewnictwo za co wielkie sorry. Chodziło mi o pola właśnie. Chodziło mi o klasę do obróbki przez usera/admina aukcji. Podczas modyfikowania trzymasz wszystko w polach klasy, a później zapisujesz je dopiero do bazy. Brak zbędnych zapytań. Do tego nie zapominajmy o cachowaniu danych. Kolejny raz można zapisać dane w polach klasy a następnie zserializować class i zapisać do pliku. wink.gif
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 Wersja Lo-Fi Aktualny czas: 13.08.2025 - 22:42