Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]łączenie się z bazą z klasy
dżozef
post
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


w tej chwili, żeby połączyć się z bazą wewnątrz klasy używam:
  1. public function fetchAll() {
  2. try {
  3. $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
  4. $today = date("Y-m-d");
  5. $query = $conn->prepare('SELECT[...]


  1. public function insertDomain($domain) {
  2. try {
  3. $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
  4. $query = $conn->prepare('INSERT INTO `foo` (`Status`)
  5. VALUES (:status);');
  6. $query->execute(array(


i tak w każdej metodzie. coś mi mówi, że nie jest to idealne rozwiązanie, bo za każdym razem tworzone jest nowe połączenie (racja?), w jaki sposób mogę to nieco ulepszyć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Beniooo
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

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


Ja zrobiłbym tak:
w jakimś pliku config czy coś dajesz
  1. $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);

Następnie dajesz w pliku z klasą:
  1. public $conn;
  2. public function __construct($connect){
  3. $this->conn=$connect;
  4. }

I następnie gdy chcesz skorzystać z połączenia w funkcji dajesz:
  1. $this->conn->prepare('SELECT[...]


Ten post edytował Beniooo 8.06.2013, 17:26:37
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Takie rozwiązanie jest złe, masz rację. Możesz stworzyć metodę getConnection(), która będzie:
  • Tworzyła obiekt PDO, jeśli jeszcze nie został utworzony
  • Zwracała obiekt PDO, jeśli już został utworzony

Taki schemat działania nazywa się singleton. Możesz ten obiekt przechowywać w zmiennej statycznej Twojej klasy. I wtedy za każdym razem zamiast na przykład:
  1. $query = $conn->prepare(...);

Możesz wywoływać:
  1. $query = self::getConnection()->prepare(...);
Go to the top of the page
+Quote Post
dżozef
post
Post #4





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


@SmokAnalog:
obawiam się, że (jeszcze) nie potrafię zrozumieć tej koncepcji, mógłbyś nieco rozwinąć, lub podać link do przykładu?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Poczytaj o wzorcu singleton: http://phpedia.pl/wiki/Singleton
Go to the top of the page
+Quote Post
dżozef
post
Post #6





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


ok, poskładałem to do kupy i mam:
  1. <?php
  2. // ustawienia bazy danych
  3. define ("DB_HOST", "localhost");
  4. define ("DB_USER", "root");
  5. define ("DB_PASS", "mysql");
  6. define ("DB_NAME", "db");
  7.  
  8. // nie zmieniac nic ponizej
  9. require_once 'classes/db.php';
  10. $db=DB::getInstance(array("host" => DB_HOST, "dbname" => DB_NAME, "username" => DB_USER, "password" => DB_PASS));
  11.  
  12. ?>


następnie classes/db.php:
  1. <?php
  2. class DB {
  3. private $db_info = array("host" => "localhost", "dbname" => "myDB", "username" => "myDB_user", "password" => "myDB_password");
  4. private $dbh;
  5.  
  6. public static $instance = NULL;
  7.  
  8. private function __construct(array $db_info = null) {
  9. if(isset($db_info)) {
  10. foreach($db_info as $key_name => $key_value) {
  11. if(!in_array($key_name, array("host", "db_name", "username", "password") || empty($key_value))) {
  12. throw new Exception("Invalid key passed!");
  13. }
  14. $this->db_info = $db_info;
  15. }
  16. }
  17. $this->dbh = new PDO("mysql:host={$this->db_info['host']};dbname={$this->db_info['db_name']}", $this->db_info['username'], $this->db_info['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  18. $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19. $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
  20. $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  21. }
  22.  
  23. public static function getInstance() {
  24. if(!isset(self::$instance)) {
  25. self::$instance = new DB();
  26. }
  27. return self::$instance;
  28. }
  29. }
  30. ?>


jakieś uwagi?

Ten post edytował dżozef 8.06.2013, 19:18:17
Go to the top of the page
+Quote Post
ber32
post
Post #7





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Witam. Spróbuj tak span

Po co te atrybuty

  1. $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  2. $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
  3. $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);


Ten post edytował ber32 8.06.2013, 21:50:49
Powód edycji: [Daiquiri]: Bez pozycjonowania proszę
Go to the top of the page
+Quote Post
dżozef
post
Post #8





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


Cytat(ber32 @ 8.06.2013, 18:57:25 ) *
Witam. Spróbuj tak klik

przedstawiasz mi zupełnie inne rozwiązanie ani trochę tego nie usprawiedliwiając, dlaczego (i czy) ten sposób jest lepszy?

Ten post edytował Daiquiri 8.06.2013, 20:57:45
Powód edycji: [Daiquiri]:
Go to the top of the page
+Quote Post
ber32
post
Post #9





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Choćby ta część jest lepsza i prawidłowa od tej przedstawionej wyżej



Ten post edytował ber32 8.06.2013, 21:51:11
Go to the top of the page
+Quote Post
dżozef
post
Post #10





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


lepsza/prawidłowa w jaki sposób?
poza tym twój przykład to nie jest singleton
Go to the top of the page
+Quote Post
ber32
post
Post #11





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Cytat
w jaki sposób mogę to nieco ulepszyć?

Rób co chcesz
Go to the top of the page
+Quote Post
dżozef
post
Post #12





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


zrobię przede wszystkim poprawnie, natomiast jeśli nie chcesz pomagać a tylko spamujesz linkiem do własnej strony to następnym razem sugeruję tego nie robić
Go to the top of the page
+Quote Post
ber32
post
Post #13





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Następnym razem już tobie nie będę pomagał. Spamowanie to nie pomaganie. Ciekawe że ty linków nie wstawiasz pomagając. (IMG:style_emoticons/default/thumbsdownsmileyanim.gif)
Dzieciak z ciebie. Medorator się znalazł, a może Administrator ?

Ten post edytował ber32 8.06.2013, 19:41:29
Go to the top of the page
+Quote Post
Daiquiri
post
Post #14





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Ber32, padło pytanie o uzasadnienie, zatem w czym widzisz problem?
Go to the top of the page
+Quote Post
ber32
post
Post #15





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


W niczym. Ja też zadałem pytanie po co te atrybuty i nie otrzymałem odpowiedzi. Problem leży gdzie indziej. Pomaganie nie wymaga wyjaśnianie niczego.
Go to the top of the page
+Quote Post
dżozef
post
Post #16





Grupa: Zarejestrowani
Postów: 125
Pomógł: 9
Dołączył: 25.05.2013

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


- te atrybuty nie zmieniają absolutnie istoty pytania
- zamiast rzeczowo wyjaśnić dlaczego twoje rozwiązanie jest lepsze spamujesz linkiem bez żadnego wyjaśnienia
- obrażasz się po moim pytaniu
- atak 'ad hominem' jak już skończyły się argumenty
Go to the top of the page
+Quote Post
ber32
post
Post #17





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Ok
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: 16.09.2025 - 10:33