Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa bazy banych z użyciem mysqli
Forum PHP.pl > Forum > PHP > Object-oriented programming
gcdreak
Witam!
Mam taką klasę:
Kod
class DB extends mysqli{
      
      private static $db;
      
      public function connect(){
          if(!self::$db){
              self::$db = @new mysqli('localhost', 'user', 'pass', 'base');
              if(@ self::$db->connect_errno){
                  throw new Exception('Nie można połączyć się z bazą danych.');
              }
          }else{
              return self::$db;
          }
      }
      
      public function query($zapytanie){
          return self::$db->query($zapytanie);
      }
      
      public function prepare($zapytanie){
          return self::$db->prepare($zapytanie);
      }
  }

Używam jej w skrycie logowania. Na początku nie miałem w niej metod query() i prepare(). Kiedy je wywoływałem to nie zwracały obiektu. Dopisałem dwie wyżej wymienione metody i wszystko działa.
Czy jednak jest to konieczne, aby tworzyć własne metody, bo przecież moja klasa DB dziedziczy po mysqli?
-=Peter=-
Za pomocą tego kodu tworzysz 2 połączenia z bazą danych... Oto przykład:
  1. <?php
  2. $db = new DB();//pierwsze połączenie z wartosciami domyslnymi z php.ini, wywołanie konstruktora mysqli
  3. $db->connect();//drugie połączenie, które wykorzystujesz w swoich zapytaniach
  4. ?>

Albo zrób aby DB nie dziedziczyła po mysqli i metody zostaw takie jakie są (instancję mysqli przechowuj w składowej statycznej), albo zostaw dziedziczenie i rozszerzaj metody mysqli. Następnym rozwiązaniem jest ustawienie metody connect jako statycznej (coś na wzór singletonu), aby zwracała instancję klasy DB.
gcdreak
Wyrzuciłem fragment:
Kod
<span class="postcolor">extends mysqli</span>

i wszystko działa.
Dopisałem jeszcze:
Kod
public function __destruct(){
         self::$db->free;
     }


Czy w destruktorze powinienem też zamknąć połączenie z bazą?
erix
Cytat
Czy w destruktorze powinienem też zamknąć połączenie z bazą?

Skrypt zamyka połączenie samoczynnie przy kończeniu wykonywania skryptu (wyjątek: stałe połączenia, które po prostu zostają dla innych sesji).

A w destruktorze? Doświadczałem "dziwnych" rzeczy przy zamykaniu połączeń w destruktorze typu najróżniejsze błędy.
gcdreak
A co myślisz o zwalnianiu wyników zapytania w destruktorze?
marcio
Cytat(gcdreak @ 8.06.2009, 13:33:48 ) *
A co myślisz o zwalnianiu wyników zapytania w destruktorze?

Ja przewaznie uzuwam do zamykania plikow chodz te chyba same tez automatyczne sie zamykaja jak w przypadku z baza tongue.gif o ogolnie do niszczenia pol ktore uzylem w danej klasie.
gcdreak
Niszczenie i zamykanie to jedno, a zwalnianie pamięci to drugie.
marcio
Cytat
Niszczenie i zamykanie to jedno, a zwalnianie pamięci to drugie.

Skoro dla ciebie to to samo to po co pytasz skoro wiesz lepiej.
gcdreak
Dla mnie to nie to samo!
erix
Jeśli macie tak się przegadywać cały wątek, to od razu powiedzcie - przynajmniej nie będę musiał czekać, aby ostrzeżenia wlepić. tongue.gif

Albo rzeczowa dyskusja poparta argumentami, albo sobie darujcie...
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.