Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Utknąłem na obsłudze baz danych
Forum PHP.pl > Forum > Przedszkole
Forti
Witam

Od pewnego czasu samodzielnie ucze się php, napisałem pewną obszerną strone strukturalnie - działa fajnie ale straszny bałagan w kodzie.. Teraz zaczałem uczyć się oop i mvc, przeczytałem mase teorii, staram się przeglądać przykłady (skrypty phpbb3 czy smf to jakaś porażka z kodu dla mnie..) i poległem na prostych rzeczach, tak prostych, że aż zły jestem ^^ od wczoraj szukam rozwiązania i nie bardzo wiem w co uderzyć..

kod pliku models/config.class.php

  1. <?php
  2. if(!defined("access"))
  3. {
  4. include("errors/access.html");
  5. exit();
  6. }
  7. /**
  8. *
  9. * połączenie z bazą danych
  10. *
  11. */
  12. try
  13. {
  14. $baza = new PDO('mysql:host=localhost;dbname=forti_arturs;charset=utf8', 'forti', 'Schroeder78');
  15. }
  16. catch(PDOException $e)
  17. {
  18. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  19. }
  20.  
  21.  
  22. class config {
  23.  
  24. public function load_config($tabela) {
  25. global $baza;
  26.  
  27. try
  28. {
  29. $cms_config_request = $baza->query("SELECT * FROM '$tabela'");
  30. $this -> $cms_config = $cms_config_request->fetch();
  31. return $this -> $cms_config;
  32. }
  33. catch(Exception $exception)
  34. {
  35. echo 'Nie można pobrać danych z bazy '.$tabela.' '.$exception ->getMessage().'';
  36. }
  37. }
  38. }
  39. ?>



i mam problem w klasie config.. wiem że load_config jest kompletnie źle napisane..

wywołanie tego w pliku index.php (później przeniosę to do kontrolera):

  1. <?php
  2.  
  3. define("access", true);
  4.  
  5. require_once("models/config.class.php");
  6.  
  7. /**
  8. *
  9. * ładujemy domyślny styl strony
  10. *
  11. */
  12. $cms_config = config::load_config(cms_config);
  13.  
  14.  
  15. include("views/{$cms_config["cms_style"]}/index.php");
  16.  
  17. ?>



wiem, że config::load_config i klasa config wogóle ze sobą nie współgrają i że całość tego to jakiś kompletny bajzel nad którym część z was się uśmieje wink.gif

Co chce osiągnąć: zwrócić tabele cms_config w postaci oczywiście tablicy.

siedzę nad tym od dłuższej chwili i jedyne co potrafie zrobić to pobieranie tej tabeli wyciągnąć poza klase.. -,-



edit:
serwer zwraca mi błąd:
Fatal error: Call to a member function fetch() on a non-object in /home/forti/domains/arturs.pl/public_html/models/config.class.php on line 30

wiem co on oznacza ale nie mam pojęcia jak to rozgryść inaczej.
Turson
SELECT * FROM '$tabela'
pomyliłeś ' z `

btw. używanie global dla uzyskania połączenia z bazą, to zło. Model powinien dziedziczyć klasę do połączenia z db, albo napisz statyczną metodę to wzięcia obiektu pdo, np. Db::get()
nospor
Robisz straszmie duzo bledow. Polecam ci zapoznanie się z tym linkiem
Temat: Jak poprawnie zada pytanie
masz tam całą masę pożytecznych wskazówek, w tym i wyswietlanie blędów php oraz bazy.

ps: zamiast brać się za obiektówkę warto by się wpierw podszkolić trochę jeszcze bardziej z podstaw.

ps2: przenosze
Forti
Wiem o tym, nospor. Z tym linkiem już dawno się zapoznałem, racja jedynie że zły dział, mój błąd. Pisząc strukturalnie, ucząc się składni itp. (` zamiast ', = zamiast == itp. błędy) będę stać w miejscu. Wole rzucić się w końcu na głęboko wode, mam sporop skryptów napisanych w mvc, oop bez mvc, jednak nie znalazłem tam informacji na ten temat (lub nie patrze dokładnie).

Turson dziękuje za pomoc.


Zrobiłem to tak:

  1. class config {
  2.  
  3. private static $_cms_config = array();
  4.  
  5.  
  6. public function load_config($tabela) {
  7. global $baza;
  8.  
  9. try
  10. {
  11. $cms_config_request = $baza->query("SELECT * FROM `$tabela`");
  12. self::$_cms_config = $cms_config_request->fetch();
  13. return self::$_cms_config;
  14. }
  15. catch(Exception $exception)
  16. {
  17. echo 'Nie można pobrać danych z bazy '.$tabela.' '.$exception ->getMessage().'';
  18. }
  19. }
  20. }


  1. $cms_config = config::load_config('cms_config');
  2.  
  3. include("views/{$cms_config["cms_style"]}/index.php");


Co do global to wiem.. ale nie bardzo rozumiem jeszcze jak to inaczej rozwiązać. Cały czas więcej czytam / szukam / analizuje niż piszę.
Turson
Co do bazy, to np. stwórz klasę DbConnection ze statyczną metodą get, która zwraca obiekt pdo.
Jak piszesz ze wzorcem MVC, to model powinien dziedziczyć główny model, a ten klasę bazodanową.

@down
Przecinki w złych, miejscach tongue.gif
nospor
Skoro uzywasz wyjatkow, do lapania bledow PDO, to ustaw w PDO by PDO rzucalo wyjatkami w czasie bledow. Teraz tego nie robisz, i bledy bazy ci nie lecą.

@Turson czemu model ma dziedziczyc po klasie bazy? Model powinien a i owszem, korzystac z obiektu bazy, ale nie powinien z niego dziedziczyc.
Turson
Jeżeli mówimy o dziedziczeniu w strukturze JakiśModel -> GłownyModel -> KlasaDb, to dziedziczymy KlasaDb, żeby mieć dostęp do obiektu bazy w JakiśModel.
No dobra, nie musi, wystarczy, że GłównyModel ma metodę zwracającą obiekt. Git.
nospor
No i teraz sobie wyobraz, ze klasa bazy zawsze w konstruktorze generuje połączenie do bazy.
Odpalasz 5 modeli w czasie jednego żądania a przez co odpalasz 5 połączen do bazy. NIe ma to zadnego sensu.

Klasa bazy to klasa bazy. Model moze miec dostep do metod klasy bazy poprzez posiadanie jej obiektu. To wystarczy.
Turson
Nieee, nie mówię, że konstruktor ma zawsze zwracać nowy obiekt, a ma działać na zasadzie sigletona, jeżeli nie ma obiektu - tworzy nowy.
Suma sumarum, zgodziliśmy się co do jednego.
pyro
Cytat(nospor @ 9.09.2014, 12:27:24 ) *
Klasa bazy to klasa bazy. Model moze miec dostep do metod klasy bazy poprzez posiadanie jej obiektu. To wystarczy.


Należałoby najpierw zacząć od tego, że model nie powinien w ogóle mieć dostępu do obiektu bazy danych, jej klasy, ani tym bardziej jej dziedziczyć.
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.