• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja klasy łączenia z bazą danych

Object Storage Arubacloud
0 głosów
431 wizyt
pytanie zadane 25 października 2015 w PHP przez babiak Obywatel (1,810 p.)

Witam,

Na wstępie chciałbym zaznaczyć, że moje wcześniejsze projekty nie były nigdy jakieś "ułomne", a jak coś zadziałało to skakałem z radości. Nie. Wszystko starałem się poukładać jak najlepiej (porozumienia między funkcjami) i optymalizować co jakiś czas. Ale wiadomo ... nie było to programowanie obiektowe. Nazwał bym to programowaniem strukturalnym w znacznej mierzę opartym na programowaniu strukturalnym ;) ... chyba każdy tak zaczynal, prawda? ;) Od jakiegoś czasu staram się programować wszystko obiektowo. Wszystko - czyli projekty, które sam sobie wyznaczam. Teraz chcę zrobić grę przeglądarkową dla siebie. Dla zdobywania skilla. Formularze logowania (sesja), rejestracji, obsługa mysql to potrafie ale nie obiektowo. Nie chce zabierać się za przerabianie istotnych dla mnie projektów i zrobić to źle. W obiektówce brak mi "pewności siebie" można powiedzieć - bo cały czas wydaje mi się, że robie coś źle. A jak widomo ilu programistów tyle pomysłów. Ale co co sądzicie np. o takiej klasie? Dobrze zacząłem pracować nad nią czy już zły kierunek obrany?

class PolaczDB
{
    private $host;
    private $login;
    private $password;
    private $db_name;
    private $polaczenie;

    function __construct($h="localhost", $l="root", $p="", $db="rpg")
    {
        $this->host = $h;
        $this->login = $l;
        $this->password = $p;
        $this->db_name = $db;
        
        $this->connectDB();
    }

    private function connectDB()
    {
        $this->polaczenie = @new mysqli($this->host, $this->login, $this->password, $this->db_name);

        if($this->polaczenie->connect_errno != 0)
        {
            echo "Error: ".$this->polaczenie->connect_errno;
        }
    }

    function closeDB()
    {
        $this->polaczenie->close();

    }
    
    function DodajRekord($xxx)
    {
        $sql = $this->polaczenie->query($xxx);
        if($sql)
        {
            echo "Dodało się elegancko";
        }
    }
    
    function rowsSum($sql)
    {
        
        $rezultat = $this->polaczenie->query($sql);
        $ile_wierszy = mysqli_num_rows($rezultat);
        $rezultat->free_result();
        return $ile_wierszy;
    }
}

 

 

ciekawi mnie czy w ogóle idę w dobrym kierunku.

Czy w konstruktorze mogę pozwolić sobie na wywołanie metody connectDB() do połączenia z bazą danych.

Czy w metodzie zliczającej ilość zwróconych wierszy mogę tam zastosować funkcję free_result(); ?

 

teraz robiąc coś takiego:

$conn = new PolaczDB();
$x = 'SELECT id FROM users WHERE login = 'admin'';

if($conn->rowsSum($x) == 0)
{
     echo "Login wolny";
}
else
{
     echo "Login zajęty";
}

$conn->closeDB();

 

Niby fajnie to wygląda, ale czy dobrze?

I np. czy $conn->closeDB() można wrzucić do destruktora? w sensie oczywiście $this->closeDB()

 

Za wszelkie uwagi z góry wielkie dzięki. Oraz podpowiedzi jak to wszystko sobie planować - na co zwracać uwagę - w jakim kierunku iść.

3 odpowiedzi

+2 głosów
odpowiedź 26 października 2015 przez event15 Szeryf (93,790 p.)
Jako, że dostałes juz odpowiedzi to wtrące swoje 3 grosze.

1. Używasz @, co jest bardzo złą praktyką.

2. Mieszasz polskie nazwy z angielskimi - zmniejszasz czytelność kodu.

3. Powinno się jawnie nadawać public, a nie pomijać jego pisanie poprzez napisanie samego "function nazwa()" - takie rzeczy muszą być z góry widoczne

4. Używanie zmiennych $xxx, $h $l $p masakruje czytelność kodu.

Wiesz że programista spędza 60% czasu na czytaniu kodu (swojego lub legacy)? Więc dbaj o to, aby ten proces był ŁATWY, SZYBKI i PRZYJEMNY.

5. Nie echuje się informacji odnośnie niedostępności konta - od tego jest throw.

6. Jesteś niekonsekwentny. Raz PascalCase, raz camelCase a innym razem coś zupełnie innego.

7. Zamknąć połączenie z bazą danych możesz w destruktorze, na pewno bardziej eleganckie zachowanie.
komentarz 27 października 2015 przez babiak Obywatel (1,810 p.)

1. Używasz @, co jest bardzo złą praktyką.

Rozumiem, że chodzi tu o tą konstrukcję try catch? Jak tak to jestem w trakcie poznawania tego bo nie miałem z tym styczności.

2. Mieszasz polskie nazwy z angielskimi - zmniejszasz czytelność kodu.

Bez komentarza. Zgadzam się w 100%.

3. Powinno się jawnie nadawać public, a nie pomijać jego pisanie poprzez napisanie samego "function nazwa()" - takie rzeczy muszą być z góry widoczne.

Racja, z tego co pamiętam jak oglądałem kursy o klasach -ogólnie programowaniu okiektowym (języka c++ Pana M.Z.) to gdy nie ma zdeklarowanego poziomu dostępu to jest private. Tak samo jest dla PHP?

4. Używanie zmiennych $xxx, $h $l $p masakruje czytelność kodu.

Wiesz że programista spędza 60% czasu na czytaniu kodu (swojego lub legacy)? Więc dbaj o to, aby ten proces był ŁATWY, SZYBKI i PRZYJEMNY.

Podobnie jak punkt nr 2.

5. Nie echuje się informacji odnośnie niedostępności konta - od tego jest throw.

Ten akrykuł opisuje poruszony temat przez Ciebie?

http://phpedia.pl/wiki/Wyj%C4%85tki

coś takiego dobre było by przy sprawdzaniu czy login już jest zajęty?

$zapytanie = $polaczenie->query("SELECT id FROM user WHERE user="admin"");

$ile_wierszy = mysqli_num_rows($zapytanie);

        if ($ile_wierszy > 0) 
       {
            throw new getMessage('Login zajęty!'); 
        }
        else
        {
            throw new getMessage('Login wolny!'); 
         }

 

6. Jesteś niekonsekwentny. Raz PascalCase, raz camelCase a innym razem coś zupełnie innego.

 No to z reguły zachowuje, tak samo jak pisanie klasy z dużej litery, a funkcji stylem camelCase. Ale przyjęte do wiadomości.

7. Zamknąć połączenie z bazą danych możesz w destruktorze, na pewno bardziej eleganckie zachowanie.

Dzięki za podpowiedź.

 

Wielki dzięki za wtrącenie swoich trzech groszy ! ;)

+1 głos
odpowiedź 25 października 2015 przez writen Nałogowiec (29,060 p.)
Dużo lepszym pomysłem byłoby, aby klasa ta dziedziczyła po klasie mysqli i zwyczajnie ją rozszerzała o nowe funkcje.

Nie ma też sensu robić metod takich jak DodajRekord, czy rowsSum, bo są one dostępne w samej klasie mysqli i te kilka linijek, które tam upakowałeś nie robi żadnej różnicy. Zamiast tego postaraj się napisać metody, które w rzeczywisty sposób ułatwią operowanie na bazie danych, np. oparte o wzorzec Active Records.

Ujednolić może sposób w jaki nazywasz zmienne i metody. Zdecyduj się czy używasz polskich czy angielskich słów.

I proszę Cię, usuń tą nieszczęsną małpę i zacznij stosować konstrukcję try catch.
komentarz 25 października 2015 przez babiak Obywatel (1,810 p.)
Mogłbyś przytoczyć przykład dziedziczenia oraz konstrukcję try catch - chodzi o przykład po prostu. Mechanizm działania dziedziczenia rozumiem.
komentarz 25 października 2015 przez efiku Szeryf (75,160 p.)
komentarz 25 października 2015 przez writen Nałogowiec (29,060 p.)
class db extends mysqli {
      
     function __construct($host, $user, $pass, $dbname) {
          try {
               parent::__construct($host, $user, $pass, $dbname);
          } catch(mysqli_sql_exception $e) {
               echo $e->errorMessage(); 
          }
     }
}

Nie wiem czy taki wyjątek zadziała, ale powinno być coś właśnie w tym stylu.

 

@efik w tej chwili chyba rozmawiamy o mysqli.

komentarz 25 października 2015 przez babiak Obywatel (1,810 p.)
Nie bardzo rozumiem strukturę tego try catch. Dla mnie to coś nowego. Jutro poczytam o co chodzi z tym operatorem zasięgu parent::__construct i ten zmiennej $e.
0 głosów
odpowiedź 25 października 2015 przez gromula Stary wyjadacz (10,070 p.)

Polecam Generator dao/obj który tworzy klasy ojb/dao dla każdej tabeli oraz stworzy CI wiele potrzebnych funkcji takich jak check, update, kill, oraz zabawę z kolekcjami czyli getall itd...http://sourceforge.net/p/simplephpdaogen/wiki/Home/

komentarz 25 października 2015 przez Boshi VIP (100,240 p.)
I jaki to ma związek z tematem?  większość  FW ma wbudowane generatory  cruda.
komentarz 25 października 2015 przez babiak Obywatel (1,810 p.)
W tym problem, że nie chce by coś się za mnie robiło - korzystając z generatora. Chce to sam zrobić i w pełni rozumieć co się dzieję oraz nabrać odpowiednie wzorce jak z czym postępować. Jak sam zacznę wymyślać nowe wzorce to nic z tego nie będzie dlatego pytam doświadczonych ;)
komentarz 25 października 2015 przez gromula Stary wyjadacz (10,070 p.)

Dałem propozycję czy będziesz z tego korzystał czy nie Twoja sprawa, ma duuuuuuużo związanego z tematem. Obiektowość zobaczyć jak jest to zrobione bardzo przestępnie, ja sam działam na tym w pracy, także jak dla mnie jest to super rozwiązanie. Łączenie z bazą ma także swoją odpowiednią klasę ale widocznie zanim powiesz "I jaki to ma związek z tematem? " mógłbyś zobaczyć co podsunąłem.
 

komentarz 25 października 2015 przez Boshi VIP (100,240 p.)
Przecież ci napisałem, że większosć FW ma wszystko wyspecjalizowane do odpowiednich klas. Nie widzę potrzeby używania jakiś osobnych bibliotek.  Zwłaszcza, że jest tyle fajnych FW, że pisanie od 0  większości rzeczy  mija się z celem.  Nawet do mickro projektów warto używać FW, choćby ze względu na MVC...
komentarz 25 października 2015 przez babiak Obywatel (1,810 p.)
A Ty jaki używasz FW? Do nauki obiektowego PHP wybrałem dobrą drogę uczenia się od zera czy powinienem używać FW?
komentarz 25 października 2015 przez writen Nałogowiec (29,060 p.)
edycja 25 października 2015 przez writen
Bardzo dobrze wybrałeś ucząc się od zera. Na etapie nauki, pisząc od zera można się wiele nauczyć. Zaczynanie nauki od frameworków mija się z celem. Frameworki to tylko narzędzia przyspieszające i ułatwiające pracę.

Jeśli zdołasz sam zaimplementować wzorzec MCV do swojego projektu gwarantuję Ci, że będziesz o krok dalej od tych, którzy nigdy tego nie zrobili lub nawet nie próbowali, a uważają się za super programistów, bo korzystają z jakiegoś frameworka. Oczywiście nie musisz dążyć do napisania własnego frameworka, bo jeśli już we wszelkich aspektach poznasz programowanie zorientowane obiektowo to wtedy będziesz mógł na poważnie zająć się tworzeniem projektów opartych o gotowe frameworki.
komentarz 25 października 2015 przez babiak Obywatel (1,810 p.)
Programowanie strukturalne + proceduralne to programowanie, które sprawia dużo radochy. Bo wszystko poukładane w miarę, da się to rozszerzać ale przestało starczać. Szybko widać postępy w projektach A jak podjąłem się obiektówki to wyszło gdzie tak na prawdę jestem :D

 

jak koledzy podpowiedzieli ... try catch nigdy tego nie użyłem nawet, wszystko po if-ach załatwiłem sobie. Muszę ogarnąc ten temat.

Podobne pytania

0 głosów
2 odpowiedzi 141 wizyt
pytanie zadane 14 lutego 2016 w PHP przez majfirst Obywatel (1,200 p.)
0 głosów
1 odpowiedź 175 wizyt
pytanie zadane 7 sierpnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 29 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)

92,550 zapytań

141,392 odpowiedzi

319,520 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...