Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z odwołaniem się do funkcji
Forum PHP.pl > Forum > PHP
Dominator
Cześć,
jestem w trakcie przeprojektowania strony, konfiguracji i innych rzeczy i zmagam się z problemem od ponad godziny. A mianowicie mam dwa pliki - DatabaseConnector.php w którym łączę się z bazami danych oraz PlayerPanel.php.
Tak wygląda struktura pierwszego:

  1. class DatabaseConnector
  2. {
  3. public $pdo;
  4. public $pdo2;
  5. public $host = "xxx";
  6. public $port = 1234;
  7. public $username = "xxx";
  8. public $password = "xxx";
  9. public $database = "xxx";
  10. public $database2 = "xxx";
  11.  
  12. public function __construct()
  13. {
  14. $this->connect();
  15. }
  16.  
  17. public function connect()
  18. {
  19. try
  20. {
  21. $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );
  22. $this->pdo2 = new PDO('mysql:host='.$this->host.';dbname='.$this->database2.';port='.$this->port, $this->username, $this->password );
  23. }
  24. catch(PDOException $e)
  25. {
  26. echo 'Połączenie nie mogło zostać utworzone.<br />'.$e->getMessage();
  27. }
  28. }
  29.  
  30. public function __destruct() {
  31. $this->closeConnection();
  32. }
  33.  
  34. public function closeConnection()
  35. {
  36. $this->pdo = null;
  37. $this->pdo2 = null;
  38. }
  39. }
  40.  



PlayerPanel.php

  1. include "DatabaseConnector.php";
  2. class PlayerPanel extends DatabaseConnector
  3. {
  4. public $nick;
  5. public $kills;
  6. public $deaths;
  7. public $kd;
  8. public $guild;
  9.  
  10. public function __construct($id)
  11. {
  12. if($id == null)
  13. {
  14. die("");
  15. exit();
  16. }
  17.  
  18. $this->nick = $id;
  19.  
  20. echo $this->getPlayerInfo($this->nick);
  21. }
  22.  
  23. public function getPlayerKills()
  24. {
  25. return $this->kills;
  26. }
  27.  
  28. public function getPlayerDeaths()
  29. {
  30. return $this->deaths;
  31. }
  32.  
  33. public function getKDRatio()
  34. {
  35. return $this->kd;
  36. }
  37.  
  38. public function getGuild()
  39. {
  40. return $this->guild;
  41. }
  42.  
  43.  
  44. public function getPlayerInfo($tag)
  45. {
  46. $stmt = $this->pdo2 -> prepare("SELECT * FROM `XXXX` WHERE player=:tag");
  47. $stmt -> bindValue(':tag', $tag, PDO::PARAM_STR); // 2
  48. $stmt->execute();
  49.  
  50. $result = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
  51. return $result;
  52. }
  53.  
  54. public function getPlayerGuild($nick)
  55. {
  56. $stmt = $this->pdo2 -> prepare("SELECT * FROM `XXXX` WHERE player=:tag");
  57. $stmt -> bindValue(':tag', $nick, PDO::PARAM_STR); // 2
  58. $stmt->execute();
  59.  
  60. $results=$stmt->fetchAll(PDO::FETCH_ASSOC);
  61. $json=json_encode($results);
  62. return $json;
  63. }
  64.  
  65.  
  66. }


Chcę sobie wyświetlić statystyki gracza metodą echo $this->getPlayerInfo($this->nick);, ale wygląda, że to wcale nie działa.

Próbowałem różnych metod, cały czas mój php twierdzi, że $this->pdo2 nie istnieje... błąd wygląda następująco: Fatal error: Uncaught Error: Call to a member function prepare() on null in .... 54 (pogrubiłem to w kodzie)
nospor
Pomijajac fakt, ze twoje klasy sa do bani, to w klasie PlayerPanel nigdzie nie odpalasz connect() z rodzica to co sie dziwisz ze nia masz polaczenia?
Dominator
Cytat(nospor @ 10.06.2017, 19:36:29 ) *
Pomijajac fakt, ze twoje klasy sa do bani, to w klasie PlayerPanel nigdzie nie odpalasz connect() z rodzica to co sie dziwisz ze nia masz polaczenia?


W czym są beznadziejne?
nospor
A chociazby w tym, obiekt klasy bazodanowej przekazuje sie do innych obiektow a nie dziedziczy sie po tym

Plus cala masa innych rzeczy.

A takich kwiatkow
die("");
exit();
to juz nawet odechciewa sie komentowac wink.gif
Dominator
Cytat(nospor @ 10.06.2017, 19:46:03 ) *
A chociazby w tym, obiekt klasy bazodanowej przekazuje sie do innych obiektow a nie dziedziczy sie po tym

Plus cala masa innych rzeczy.

A takich kwiatkow
die("");
exit();
to juz nawet odechciewa sie komentowac wink.gif


Na siłę próbujesz czepiać się rzeczy, które nie dotyczą tematu. Wspomniałem w pierwszym poście, że jestem w trakcie przeprojektowania, dlatego też owe "kwiatki" zostaną zmodyfikowane, aczkolwiek dziękuję za krytykę.
Po wywołaniu metody connect() w dalszym ciągu nie jestem w stanie wyświetlić informacji z bazy danych, co robię źle?
nospor
Nie czepiam sie na sile. Udzielilem ci odpowiedzi co robisz zle. Przy okazji tylko wspomnialem ze twoj kod jest do bani. To ty to ciagnales dalej nie ja tongue.gif

Zrobiles connect()? Super, to moze pokazesz nam jeszcze jak to zrobiles, bo najwyrazniej nadal zle.

ps:
Cytat
Wspomniałem w pierwszym poście, że jestem w trakcie przeprojektowania

Takie rzeczy jak die i exit nie powinny sie pojawic w zadnej wersji tego kodu. Skoro pytales sie mnie, co jest zle, najwyrazniej nie zdawales sobie z tego nadal sprawy.
Dominator
Cytat(nospor @ 10.06.2017, 19:54:46 ) *
Nie czepiam sie na sile. Udzielilem ci odpowiedzi co robisz zle. Przy okazji tylko wspomnialem ze twoj kod jest do bani. To ty to ciagnales dalej nie ja tongue.gif

Zrobiles connect()? Super, to moze pokazesz nam jeszcze jak to zrobiles, bo najwyrazniej nadal zle.

ps:

Takie rzeczy jak die i exit nie powinny sie pojawic w zadnej wersji tego kodu.


Chwilę pomyślałem i wystarczyło dodać parent::__construct(); do klasy PlayerPanel, wygląda to tak:

  1. class PlayerPanel extends DatabaseConnector
  2. {
  3. public $nick;
  4. public $kills;
  5. public $deaths;
  6. public $kd;
  7. public $guild;
  8.  
  9. public function __construct($id)
  10. {
  11. parent::__construct();
  12.  
  13. $this->nick = $id;
  14. $data_info = json_decode($this->getPlayerInfo($this->nick));
  15.  
  16. $this->kills = $data_info[0]->kills;
  17. //...
  18. }
  19. }


Zaczęło działać i mogę kontynuować pracę, bardzo dziękuję za pomoc wink.gif Nie skapnąłem się, że nie wywołuję nigdzie tego.
A tak btw - czytałem trochę o tym całym OOP (niedawno wróciłem do programowania) i trochę nie mogę zrozumieć co w moim kodzie jest nie tak... chodzi o metodę getPlayerInfo, która w jakiś nieprawidłowy sposób pobiera dane? Albo klasa bazodanowa sama w sobie jest błędnie napisana? Byłoby miło gdyby ktoś mnie pokierował co robię źle, nie jestem na tak świetnym poziomie jak zapewne połowa tego forum i cały czas się uczę smile.gif
Pozdrawiam
nospor
Napisalem ci na samym poczatku co jest zle. No dobra, napisalem tylko dwa, jeden z nich byl
Cytat
A chociazby w tym, obiekt klasy bazodanowej przekazuje sie do innych obiektow a nie dziedziczy sie po tym

Poczytaj o wzorcu Dependcy Injection

Bledow jest cala inna masa, ale popraw wpierw jeden.
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.