Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] klasa bazodanowa
Forum PHP.pl > Forum > PHP
poczatkujaca12
  1. <?php
  2. class DB {
  3. private $dbHost = "DB_HOST";
  4. private $dbUsername = "DB_USERNAME";
  5. private $dbPassword = "DB_PASSWORD";
  6. private $dbName = "DB_NAME";
  7.  
  8. public function __construct(){
  9. if(!isset($this->db)){
  10. $conn = new PDO("mysql:".$this->dbHost.";dbname:". $this->dbName, $this->dbUsername, $this->dbPassword);
  11. if($conn->connect_error){
  12. die("Failed to connect with MySQL: " . $conn->connect_error);
  13. }else{
  14. $this->db = $conn;
  15. }
  16. }
  17. }
  18.  
  19. public function costam(){
  20. $result = $this->db->query("select...");
  21. //Pozostała część funkcji zwracająca select czy robiąca to co od niej chcę
  22. }

W skrypcie php robię:
  1. $db = new DB();
  2. $db->costam();

Tylko zdarza się, że czasami przekraczam limit połączeń na minutę z bazą danych... Może to wynikać z tego że każdorazowo new DB tworzy nowe połączenie? Da się zrobić jakoś żeby połączenie było jedno i to samo podczas trwania np sesji?
nospor
twoj konstruktor nie ma sensu
if(!isset($this->db)){
w konstruktorze zawsze bedzie TRUE bo $this->db nie istnieje.



O to:
$db = new DB();

powinnas robic tylko RAZ w trakcie calego dzialania skryptu. Robi sie to zazwyczaj w index.php a nastepnie zmienna $db przekazuje tam gdzie trzeba. Jesli nie jestes jeszcze obyta Dependency INjection to proponuje poczytaj o SINGLETON. Nie jest to idealny wzorzec, ale na poczatek sie nada
poczatkujaca12
Czyli zmienną $db wrzucić w sesję i sprawdzać w pozostałej części skryptu czy jej nie ma?
  1. $db->cos();
  2. $db->costam();

Na jednej stronie (np index) nie powinien tworzyć 2 połączeń? Bo w sumie tego obawiam się najbardziej - że każde zapytanie do bazy tworzy nowe połączenie
nospor
Nie, $db nie wrzucasz w sesje.
I tak jak mowilem oto:
$db = new DB();
masz robic tylko raz a nie za kazdym razem gdy robisz query
poczatkujaca12
Tylko jak mam skrypt mam strony:
Index.php
Read.php
Cos.php
To read.php czy cos.php nie widzą zmienniej z index.php (czy się mylę?)
nospor
Dlatego powiedzialem: zainteresuj sie SINGLETON. Na poczatek sie nada i rozwiaze twoj problem

Pierwszy lepszy link z przykladem klasy DB

https://treewebsolutions.com/articles/the-s...ttern-in-php-65
poczatkujaca12
Tylko w tym przypadku nie mogę generować podstron w stylu
Index.php?page=read...
A serwis ma troszkę podstron dziwnej treści;-)
nospor
A kto ci broni?
poczatkujaca12
Stopień zaawansowania projektu (i poniekąd zleceniodawca)
nospor
Nie rozumiem. Podalem ci jako rozwiazanie twojego problemu SINGLETON. Podalem ci linka do przyklady. W czym problem? Naprawde zleceniodawca broni ci uzyc singleton?
aras785
Tak jak nospor napisał, singleton lub jakaś klasa w samym kernelu - tutaj fajnie wyjaśnione: https://refactoring.guru/pl/design-patterns...ton/php/example

@nospor jak tam temat z dockerem? biggrin.gif
nospor
edit: dobra, zrob poprostu tak:

  1. class DB {
  2. static $db = null;
  3. private $dbHost = "DB_HOST";
  4. private $dbUsername = "DB_USERNAME";
  5. private $dbPassword = "DB_PASSWORD";
  6. private $dbName = "DB_NAME";
  7.  
  8. public function __construct(){
  9. if(!isset(self::db)){
  10. $conn = new PDO("mysql:".$this->dbHost.";dbname:". $this->dbName, $this->dbUsername, $this->dbPassword);
  11. if($conn->connect_error){
  12. die("Failed to connect with MySQL: " . $conn->connect_error);
  13. }else{
  14. self::db = $conn;
  15. }
  16. }
  17. }
  18.  
  19. //reszta twoich funkcji

tylko zamiast $this->db , uzywaj self:: db w twoich funkcjach
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-2024 Invision Power Services, Inc.