Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwa polaczenia z baza danych - czy tak moze byc ?
Forum PHP.pl > Forum > PHP > Object-oriented programming
nieraczek
Jeśli mam plik klasaPolaczenie.php:
  1. <?php
  2. class klasaPolaczenie
  3. {
  4.    private $polaczenie;
  5.    
  6.    private $host = 'localhost';
  7.    private $uzytkownik = 'root';
  8.    private $haslo = '';
  9.    private $nazwa_bazy = 'baza';
  10.  
  11.    
  12.    public function __construct()
  13.    {
  14.        @$this->polaczenie = new mysqli($this->host, $this->uzytkownik, $this->haslo, $this->nazwa_bazy);
  15.        if(mysqli_connect_errno())
  16.        {
  17.            echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error() . '</p>';
  18.        }
  19.        else
  20.        {
  21.            $this-> polaczenie -> query("SET NAMES utf8");
  22.            $this-> polaczenie -> query("SET CHARACTER_SET utf8_unicode_ci");
  23.            
  24.        }    
  25.    }
  26.    
  27.    
  28.    public function __destruct()
  29.    {
  30.        @$this->polaczenie->close();
  31.    }    
  32.  
  33.    
  34.    public function zapytanie($z)
  35.    {
  36.        $wynik = $this->polaczenie->query($z) or die('blad w zapytaniu');
  37.        return $wynik;
  38.    }
  39. }
  40. ?>


klasaGaleria.php, w której tworzę obiekt klasy klasaPolaczenie:
  1. <?php
  2. class klasaGaleria
  3. {
  4.    private $polaczenie;
  5.  
  6.    
  7.    public function __construct()
  8.    {
  9.        $this->polaczenie = new klasaPolaczenie();
  10.    }
  11.    
  12.    
  13.    public function __destruct()
  14.    {
  15.        
  16.    }
  17.    
  18.    
  19.    public function pobierzKategorieObrazkow()
  20.    {
  21.        return $this->polaczenie->zapytanie("SELECT * FROM kategorie_obrazkow ORDER BY id ASC");
  22.    }
  23. }
  24. ?>



W szablonie strony mam (bo zrobilem szablon strony + jest dodawana zawartosc do szablonu jak mam konkretne strony):
  1. <?php
  2. require_once ("klasy/klasaPolaczenie.php");
  3. $polacz = new klasaPolaczenie();
  4. ?>



Dodatkowo np. po wejściu na stronę z obrazkami tworzę obiekt klasy klasaGaleria, który otwiera drugie połączenia z bazą danych (pierwsze polaczenie jest w szablonie):
  1. <?php
  2. require_once ("klasy/klasaGaleria.php");
  3. $galeria = new klasaGaleria();
  4.  
  5.  
  6. $result = $galeria->pobierzKategorieObrazkow();
  7. while($wiersz = $result->fetch_array())
  8. {
  9. ............
  10. }
  11. ?>

czyli na tej stronie będę mieć dwa połączenia z bazą danych a nie jedno, tak może być - czy powinienem to zrobić jakoś inaczej ? smile.gif Bo jak bym stworzył na tej stronie 100. obiektów klasy klasaGaleria to byłoby 101. połączeń z bazą danych.
skowron-line
http://phpedia.pl/wiki/Singleton to jest lekarstwo na twoje x połączeń z bazą
nieraczek
Chodziło mi o to o czym piszesz i o coś innego, odnośnie drugiej kwestii to znalazłem błąd - w szablonie zrobiłem tworzenie obiektu klasy klasaPolaczenie - nie wiem po co, bo obiekty tej klasy tworze w innych klasach, np. w klasie klasaGaleria - wiec usunalem to z szablonu:
  1. <?php
  2. $polacz = new klasaPolaczenie();
  3. ?>



A masz może przykład z tym singletonem i łączeniem z bazą danych, bo znajduje różne singletony, tylko nie te do połączeń z bazą danych ?
kantek
Co do singletona z db to tworzysz sobie normalną klasę do obsługi bazy.

w klasie tworzysz 1 zmienną statczyną np.
private static $instances =0;

(static określa zmienną, która jest dzielona między wszystkimi instancjami - każda zmiana dokonana w wartości zmiennej automatycznie przenosi się na wszystkie instancje)

w konstruktorze wtedy dajesz sobie sprawdzanie czy już jest taki obiekt twojej klasy

  1. <?php
  2. public __construct(...twoje dane do polaczenia...)
  3. {
  4.      if(self::$instances == 0)  //jeszcze nie otwarto polacznie z db
  5.      {$this->polaczenie = ... laczenie z db ....}
  6.      else
  7.      { ... jakis komunikat ...}
  8. }
  9. ?>


i w destruktorze dajesz sobie

  1. <?php
  2. public __destruct()
  3. {
  4.       self::$instances = 0;
  5.       mysql_close($this->polaczenie);
  6.       unset($this->connection);
  7. }
  8. ?>


Możesz zrobić troszeczkę inaczej (np.konstruktor prywatny), ale zasada działania jest ta sama.

Pozdrawiam
nieraczek
Dziękuję, zrobiłem w końcu w ten sposób:
  1. <?php
  2. final class klasaPolaczenie
  3. {
  4.  
  5.  private static $oInstance = false;
  6.  
  7.  private $polaczenie;
  8.    
  9.  private $host = 'localhost';
  10.  private $uzytkownik = 'root';
  11.  private $haslo = '';
  12.  private $nazwa_bazy = 'baza';
  13.    
  14.  
  15.  private function __construct ( )
  16.  {
  17.        @$this->polaczenie = new mysqli($this->host, $this->uzytkownik, $this->haslo, $this->nazwa_bazy);
  18.        if(mysqli_connect_errno())
  19.        {
  20.            echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error() . '</p>';
  21.        }
  22.        else
  23.        {
  24.            $this-> polaczenie -> query("SET NAMES utf8");
  25.            $this-> polaczenie -> query("SET CHARACTER_SET utf8_unicode_ci");            
  26.        }
  27.  
  28.        echo "start<br/>";    
  29.  }
  30.  
  31.  public function __destruct()
  32.  {
  33.        @$this->polaczenie->close();
  34.        
  35.        echo "koniec<br/>";
  36.  }
  37.  
  38.  
  39.    public static function getInstance()
  40.    {
  41.        if( self::$oInstance == false )
  42.        {
  43.            self::$oInstance = new klasaPolaczenie();
  44.        }        
  45.        return self::$oInstance;
  46.    }
  47.  
  48.  
  49.      public function zapytanie($z)
  50.    {
  51.        $wynik = $this->polaczenie->query($z) or die('blad w zapytaniu');
  52.        return $wynik;
  53.    }  
  54.  
  55. }
  56. ?>


oraz
  1. <?php
  2. class klasaGaleria
  3. {
  4.    private $polaczenie;
  5.  
  6.    
  7.    public function __construct()
  8.    {
  9.        $this->polaczenie = klasaPolaczenie::getInstance();
  10.    }
  11. }
  12. ?>


Chyba jest ok smile.gif
kantek
Pewnie, że tak. Oto przykład:
  1. <?php
  2. class Singleton {
  3.        static $instance;
  4.        private $value='value1';
  5.  
  6.        /**
  7.          * Prywatny konstruktor - uniemożliwia normalne utworzenie obiektu tej klasy
  8.          */
  9.        private function __construct(){}
  10.  
  11.        /**
  12.          * Prywatna metoda __clone - uniemozliwia utworzenie kopii obiektu
  13.          */
  14.        private function __clone(){}
  15.  
  16.        /**
  17.          * Zwraca instancję obiektu i tworzy ja gdy istnieje taka potrzeba
  18.          */
  19.        static function instance(){
  20.            if(empty(self::$instance)) self::$instance=new Singleton;
  21.            return self::$instance;
  22.        }
  23.  
  24.        public function setVariable($value){
  25.            $this->variable=$value;
  26.        }
  27.  
  28.        public function getVariable(){
  29.            return $this->variable;
  30.        }
  31. }
  32. ?>


no i wtedy instancje tworzymy inaczej:

  1. <?php
  2. $instance=Singleton::instance();
  3. $instance->setVariable('value2');
  4. echo $instance->getVariable();
  5.  
  6. echo '<br />';
  7.  
  8. $instance2=Singleton::instance();
  9. echo $instance2->getVariable();
  10. ?>


Przykład pochodzi z
http://4programmers.net/PHP/Wzorce_Projektowe#id-Singleton
tam masz dokładniej wszystko opisane.


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