Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] klasa php + pdo
jol.us_
post 20.02.2016, 21:17:53
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


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
goartur
post 20.02.2016, 21:36:10
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 20.02.2016, 21:44:58
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


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
goartur
post 20.02.2016, 23:04:37
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 20.02.2016, 23:08:43
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ę


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
com
post 21.02.2016, 13:33:21
Post #6





Grupa: Zarejestrowani
Postów: 3 032
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 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
Go to the top of the page
+Quote Post
goartur
post 21.02.2016, 18:28:50
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 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?
Go to the top of the page
+Quote Post
com
post 21.02.2016, 20:00:59
Post #8





Grupa: Zarejestrowani
Postów: 3 032
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 22.02.2016, 09:22:46
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 22.02.2016, 09:26:04
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 22.02.2016, 11:25:34
Post #11





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
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 wink.gif


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 01:00