Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] klasa php + pdo
jol.us_
post
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?

Ten post edytował jol.us_ 20.02.2016, 21:24:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
goartur
post
Post #2





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
jol.us_
post
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował jol.us_ 20.02.2016, 21:55:43
Go to the top of the page
+Quote Post
goartur
post
Post #4





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował goartur 20.02.2016, 23:10:32
Go to the top of the page
+Quote Post
jol.us_
post
Post #5





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Teraz już bardziej rozumiem. Dziękuję
Go to the top of the page
+Quote Post
com
post
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)

Tylko znacznie lepiej jest odseparować html od logiki aplikacji (IMG:style_emoticons/default/smile.gif)

goartur singleton to antywzorzec, jak możesz to nie używaj (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
goartur
post
Post #7





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)

Tylko znacznie lepiej jest odseparować html od logiki aplikacji (IMG:style_emoticons/default/smile.gif)

goartur singleton to antywzorzec, jak możesz to nie używaj (IMG:style_emoticons/default/smile.gif)

Czemu nie jest zalecane?
I o co chodzi z singleton?
Go to the top of the page
+Quote Post
com
post
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


o psr słyszałeś?
No to co pokazałeś to przecież wzorzec singleton
Go to the top of the page
+Quote Post
goartur
post
Post #9





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


Nie wiem jak to sie nazywa dlatego, kiedys sie tego nauczylem i uzywalem,
chodzi mi bardziej dlaczego nie uczywac _ w prywatnych zmiennych
Go to the top of the page
+Quote Post
kapslokk
post
Post #10





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


com Ci napisał - PSR
Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:32