Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]łączenie się z bazą z klasy
Forum PHP.pl > Forum > Przedszkole
dżozef
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ć?
Beniooo
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[...]
SmokAnalog
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(...);
dżozef
@SmokAnalog:
obawiam się, że (jeszcze) nie potrafię zrozumieć tej koncepcji, mógłbyś nieco rozwinąć, lub podać link do przykładu?
SmokAnalog
Poczytaj o wzorcu singleton: http://phpedia.pl/wiki/Singleton
dżozef
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?
ber32
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);
dżozef
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?
ber32
Choćby ta część jest lepsza i prawidłowa od tej przedstawionej wyżej

dżozef
lepsza/prawidłowa w jaki sposób?
poza tym twój przykład to nie jest singleton
ber32
Cytat
w jaki sposób mogę to nieco ulepszyć?

Rób co chcesz
dżozef
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ć
ber32
Następnym razem już tobie nie będę pomagał. Spamowanie to nie pomaganie. Ciekawe że ty linków nie wstawiasz pomagając. thumbsdownsmileyanim.gif
Dzieciak z ciebie. Medorator się znalazł, a może Administrator ?
Daiquiri
Ber32, padło pytanie o uzasadnienie, zatem w czym widzisz problem?
ber32
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.
dżozef
- 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
ber32
Ok
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.