Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z funkcjami klasy db w klasie cfg
Forum PHP.pl > Forum > PHP
morawcik89
Mam taki oto problem:
- W pliku index.php inlcuduję pliki klas db (bazy) i get_cfg (config strony)
- Tworzę nowy obiekt klasy get_cfg i wywołuję funkcję cfg
- W contruct klasy get_cfg tworzę obiekt klasy db
- W funkcji cfg pobieram z bazy zawartość komórki theme
- Includuję pliki z folderu template/pobrana_wartość/

Przeglądarka zwraca błąd, że pliki template//... (... -> odpowiedni plik) nie istnieje

index.php
  1. <?
  2. $user = 'sys';
  3. if($_SESSION['user']) $user = $_SESSION['user'];
  4.  
  5. include 'class/db.class.php';
  6. include 'class/get_cfg.class.php';
  7.  
  8. $cfg = new get_cfg;
  9. $temp = $cfg->cfg($user);
  10.  
  11. include 'template/'.$temp.'/head.tpl';
  12. include 'template/'.$temp.'/register.tpl';
  13. include 'template/'.$temp.'/foot.tpl';
  14.  
  15. ?>

class/db.class.php
  1. <?
  2.  
  3. class db
  4. {
  5.  private $query = '';
  6.  private $connect = '';
  7.  private $db_name = '';
  8.  private $go_query = '';
  9.  
  10.  function __construct()
  11.  {
  12. $this->connect = $this->connect();
  13.  }
  14.  function __destruct()
  15.  {
  16. $this->close();
  17.  }
  18.  
  19.  private function connect()
  20.  {
  21. $db = parse_ini_file('config.ini', true);
  22. $this->connect = mysql_connect($db['mysql']['host'], $db['mysql']['user'], $db['mysql']['pass']);
  23. $this->db_name = $db['mysql']['name'];
  24. mysql_select_db($this->db_name);
  25.  }
  26.  
  27.  public function query($query)
  28.  {
  29. $this->query = $query;
  30.  }
  31.  
  32.  public function go_query()
  33.  {
  34. $this->go_query = mysql_query($this->query);
  35.  }
  36.  
  37.  public function assoc()
  38.  {
  39. return mysql_fetch_assoc($this->go_query);
  40.  }
  41.  
  42.  public function row()
  43.  {
  44. return mysql_fetch_array($this->go_query);
  45.  }
  46.  
  47. }
  48.  
  49. ?>

class/get_cfg.class.php
  1. <?
  2.  
  3. class get_cfg
  4. {
  5.  private $db = '';
  6.  
  7.  function __construct()
  8.  {
  9. $this->db = new db;
  10.  }
  11.  
  12.  public function cfg($user)
  13.  {
  14. $query = $this->db->query("SELECT * FROM cfg WHERE user = '$user'");
  15. $go = $this->db->go_query();
  16. $assoc = $this->db->assoc();
  17. $temp = $this->db->assoc['theme'];
  18. return $temp;
  19.  }
  20. }
  21.  
  22. ?>
Crozin
error_reporting(E_ALL | E_STRICT);

i czy tearaz cos zwraca?
morawcik89
Cytat
Notice: Undefined index: user in ...
Notice: Undefined property: db::$assoc in ...


EDIT:
Pierwszy błąd wyeliminowałem zmieniając linię z $_SESSION['user'] na
Cytat
if(!empty($_SESSION['user'])) $user = $_SESSION['user'];


EDIT2:
Temat do zamknięcia.
Błąd był tu: $temp = $this->db->assoc['theme'];
Miało być : $temp = $assoc['theme'];
LBO
Nie pobiera Tobie z bazy pola 'theme'... ale to Twój najmniejszy problem.

Zalecałbym całkowitą rekonstrukcję Tych klas, bo daleko na razie im do OOP. Programowanie obiektowe to nie tylko zawieranie funkcjonalności w klasach. Idzie za tym cała masa wytycznych, wzorców jak i zdrowego rozsądku.

1. Klasa get_cfg nie powinna mieć nic wspólnego z klasą db. Klasa get_cfg pobiera tylko konfigurację i zwraca ją w czytelnej formie.
2. Klasa db, powinna tylko pobierać parametry połączenia i wykonywać akcje na bazie -> connect(), query(), fetch() etc (polecam zapoznanie się PDO).

A powyższymi (czyli pobranie konfiguracji i połączenie z bazą powinien robić jeszcze inny nadrzędny skrypt).
Można by też mieć dodatkową klasę User, reprezentującą użytkownika wraz z przypisaną do niego konfiguracją (themes?). Dopiero ona mogłaby używać obiektu klasy db, do pobierania danych.

Dodatkowo nazwy. get_cfg? Instancje klasy reprezentują sobą jakby niezależne obiekty, a nie same akcje jakie wykonują. Nie lepiej by było, żeby posiadać klasę Config, która posiada metodę get()?

  1. <?php
  2. $config = new Config();
  3. $config->load('config.ini'); // pobierasz konfiguracje aplikacji
  4.  
  5. // tworzysz połączenie z baza używając danych z konfiguracji
  6. $db = new Database($config->get('host'), $config->get('user'), $config->get('pass'), $config->get('dbname'));
  7.  
  8. // tworzysz obiekt użytkownika i przekazujesz
  9. // do niego połączenie z baza, by mógł wewnętrznie
  10. // wykorzystać je do pobrania odpowiednich danych
  11. $user = new User($db);
  12. $user->getThemeName(); // pobierasz nazwę folderu dla theme'a, którą klasa pobrała np w konstruktorze używając $db
  13. ?>



Powyzsze to prosty przykład, ale powinien mniej więcej wyjaśnić o co mi chodzi.
Cysiaczek
Ta.. oop... a ja jestem św Mikołajem smile.gif
Przenoszę oczko wyżej.
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.