Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] klasa php + pdo
Forum PHP.pl > Forum > Przedszkole
jol.us_
Witam,

Mam pytanie. Jak wcielić zapytania PDO do własnej klasy. Jak to jest realizowane.
Czy takie używanie jak poniżej jest poprawne, czy realizuje się to inaczej?

  1. <?php
  2. class Strona {
  3. public $url;
  4.  
  5. public function PobierzMetaTagi() {
  6. try {
  7. $db = new PDO('mysql:host='.DB_HOST.';dbname='.DB.';charset=utf8', DB_USER, DB_PASS);
  8. $db->exec("set names utf8");
  9.  
  10. $wynik = $db->prepare("SELECT title, description, keywords FROM ".DB_PREFIX."strony WHERE url=:url LIMIT 1");
  11. $wynik -> execute(array(
  12. ':url'=>$this->url
  13. ));
  14. $rekord = $wynik->fetch(PDO::FETCH_ASSOC);
  15.  
  16. print '<title>'.$rekord['title'].'</title>';
  17. print '<meta name="description" content="'.$rekord['description'].'" />';
  18. print '<meta name="keywords" content="'.$rekord['keywords'].'" />';
  19.  
  20. $db = null;
  21.  
  22. } catch (PDOException $e) {
  23. throw new Exception('Could not connect to database');
  24. }
  25. }
  26. }
  27. ?>



Moje wątpliwości głównie są takie, że przy takim użyciu w każdej funkcji muszę łączyć się z baza. Mało to wygodne.
Może lepiej nawiązać połączenie w ciele strony i przekazać do klasy ma zasadzie "$strona->db = $db"?
A może jeszcze inaczej?
goartur
tworzysz klase database w ktorej laczysz sie z baza i zwracasz polaczenie,
w construct klasy w ktorej chcesz uzywac owego polaczenia robisz cos w stylu

$this->_db = Database::Connect();

nastepnie wywolujesz ja w sposob
$this->_db->prepare
$this->_db->execute()

itp
jol.us_
A takie rozwiązanie jest ok?

klasa
  1. class Strona {
  2. private $url;
  3. private $db;
  4.  
  5. public function __construct($url, $db) {
  6. $this->_url = $url;
  7. $this->_db = $db;
  8. }
  9.  
  10. public function PobierzMetaTagi() {
  11.  
  12. $wynik = $this->_db ->prepare("SELECT title, description, keywords, robots FROM ".DB_PREFIX."strony WHERE url=:url LIMIT 1");
  13. $wynik -> execute(array(
  14. ':url'=>$this->_url
  15. ));
  16. $rekord = $wynik->fetch(PDO::FETCH_ASSOC);
  17.  
  18. print '<title>'.$rekord['title'].'</title>';
  19. print '<meta name="description" content="'.$rekord['description'].'" />';
  20. print '<meta name="keywords" content="'.$rekord['keywords'].'" />';
  21. print '<meta name="robots" content="'.$rekord['robots'].'" />';
  22.  
  23. }
  24. }


wywolanie
  1. try {
  2. $db = new PDO('mysql:host='.DB_HOST.';dbname='.DB.';charset=utf8', DB_USER, DB_PASS);
  3. $db->exec("set names utf8");
  4. } catch (PDOException $e) {
  5. throw new Exception('Could not connect to database');
  6. }
  7.  
  8. $strona = new Strona('url', $db);
  9. $strona->PobierzMetaTagi();



Zaczynam dopiero z PHP obiektowo i trochę kombinuje po omacku.
Pełno jest tutków w sieci na temat programowania obiektowego, ale takiego z uzyciem PDO to nie znalazlem.
goartur
Cos w tym stylu.
Pokaze ci inny przyklad:
Database.php

  1. class Connection
  2. {
  3. private static $instance;
  4. public static function getInstance(){
  5.  
  6. if(!self::$instance){
  7. try {
  8. self::$instance = new PDO("mysql:host=$host;", 'root', 'haslo');
  9. return self::$instance;
  10. }catch (Exception $Error){
  11. echo 'Error has been detected:';
  12. die('Error has been detected: ' . $Error->getMessage());
  13. }
  14. }
  15. }
  16. }


server.php

  1.  
  2. class Server
  3.  
  4. {
  5.  
  6. private $_db;
  7.  
  8. public static $instance;
  9.  
  10. public function __construct(){
  11.  
  12. $this->_db = Connection::getInstance();
  13.  
  14. }
  15.  
  16. public function selectAbleSkills(){
  17.  
  18. $query = $this->_db->prepare("SELECT * FROM skill_type");
  19.  
  20. $query->execute();
  21.  
  22. return $query;
  23.  
  24. }
  25.  
  26. public static function getInstance()
  27.  
  28. {
  29. if(self::$instance === null)
  30. {
  31. self::$instance = new self();
  32. }
  33. return self::$instance;
  34. }
  35.  
  36.  
  37.  
  38. }
jol.us_
Teraz już bardziej rozumiem. Dziękuję
com
jol.us_ tak twoje jest ok, a tego wyżej nie słychaj tyle że nie _db itp bo masz $db, zresztą underscore nie jest już zalecane smile.gif

Tylko znacznie lepiej jest odseparować html od logiki aplikacji smile.gif

goartur singleton to antywzorzec, jak możesz to nie używaj smile.gif
goartur
Cytat(com @ 21.02.2016, 13:33:21 ) *
jol.us_ tak twoje jest ok, a tego wyżej nie słychaj tyle że nie _db itp bo masz $db, zresztą underscore nie jest już zalecane smile.gif

Tylko znacznie lepiej jest odseparować html od logiki aplikacji smile.gif

goartur singleton to antywzorzec, jak możesz to nie używaj smile.gif

Czemu nie jest zalecane?
I o co chodzi z singleton?
com
o psr słyszałeś?
No to co pokazałeś to przecież wzorzec singleton
goartur
Nie wiem jak to sie nazywa dlatego, kiedys sie tego nauczylem i uzywalem,
chodzi mi bardziej dlaczego nie uczywac _ w prywatnych zmiennych
kapslokk
com Ci napisał - PSR
viking
Service Manager przez wielu też jest uważany za antywzorzec a jednak jest obecny we wielu frameworkach. Skoro singleton się sprawdza to znaczy że jest poprawny 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.