Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilka klas i baza danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
koxu1996
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?
klocu
  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.
koxu1996
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ą
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.
sajegib
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
koxu1996
A czy zrobienie połączenia bez zamknięcia w klasie i dołączanie wszędzie to dobre rozwiązanie?
sajegib
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
Wazniak96
Chyba źle się wyraziłem, w każdym razie mniej więcej o to samo mi chodziło. smile.gif
koxu1996
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ć?
Arcioch
Jak dla mnie najlepszym rozwiązaniem będzie użycie Singletonu smile.gif
sajegib
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. }
koxu1996
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ć?
sajegib
Nie możesz użyć :: (dwa dwukropki), bo ten operator dotyczy metod/pól statycznych

zamień na ->
koxu1996
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?
CuteOne
@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:)
koxu1996
@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.
Wazniak96
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
koxu1996
@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.
Wazniak96
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
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.