Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa do obsługi mySQL.
boosik01
post
Post #1





Grupa: Zarejestrowani
Postów: 91
Pomógł: 1
Dołączył: 19.08.2009

Ostrzeżenie: (10%)
X----


Witam! Od 5 dni uczę się OOP. Pewnie jak każda osoba która uczy się OOP naukę rozpoczyna przy pisaniu klasy do obsługi mysql.
No więc i tak ja też uczyniłem. Chciałbym byście spojrzeli na moją klasę i postarali się jakoś mi pomóc (co dodać, poprawić etc.)
Chcę napisać jeszcze klasę do zapisywania logów z błędów, i tu pojawia się pytanie czy w OOP zapisywanie do pliku jest normalnie za pomocą funkcji
fwrite() czy też jest jakaś inna funkcja bardziej nadająca się do tego typu operacji.

PS. Pod klasą dałem utworzenie obiektów, bo nie chciało mi się robić już tego w osobnych plikach.
  1. <?php
  2. /**
  3.  * Prosta klasa obsługi bazy danych MySQL
  4.  * Author: boosik01
  5.  * (c) 2011
  6.  */
  7. class mySQL
  8. {
  9. private $sConfig ;
  10.  
  11. public function __construct($sConfig = '')
  12. {
  13. if(!$sConfig)
  14. {
  15. $this->host = $sConfig = 'localhost' ;
  16. $this->user = $sConfig = 'root' ;
  17. $this->pass = $sConfig = '' ;
  18. $this->db = $sConfig = 'test' ;
  19.  
  20. if(!@$this->connect = mysql_connect($this->host, $this->user, $this->pass))
  21. throw new Exception ('Nie można połączyć się z bazą danych! ' . mysql_error() );
  22. if(!@mysql_select_db($this->db))
  23. throw new Exception ('Błąd wyboru bazy danych! ' . mysql_error());
  24. }
  25. else
  26. {
  27. $sConfig == NULL ;
  28. }
  29. }
  30.  
  31. public function __destruct()
  32. {
  33. mysql_close($this->connect) ;
  34. }
  35.  
  36. public function mysql_fetch_array($mysql_query)
  37. {
  38. $this->mysql_query = $mysql_query ;
  39. if(!@$this->mysql_query = mysql_fetch_array(mysql_query($this->mysql_query)))
  40. throw new Exception ('Wystąpił błąd w wyświetlaniu / lub UPTADE danych. ' . mysql_error());
  41. return $this->mysql_query ;
  42.  
  43. }
  44.  
  45. public function query($query)
  46. {
  47. $this->query = $query ;
  48. if(!@$this->query = mysql_query($this->query))
  49. throw new Exception ('Wystąpił błąd w konstrukcji zapytania. ' . mysql_error()) ;
  50. return $this->query ;
  51. }
  52. }
  53.  
  54. try
  55. {
  56. $new = new mySQL() ;
  57. $dane = $new->query("INSERT INTO users SET user='boooooo'") ;
  58. echo $dane['user'] ;
  59. }
  60. catch (Exception $error)
  61. {
  62. echo 'Wystąpił błąd. Administracja została już o tym poinformowana. Przepraszamy za kłopoty.' ;
  63. $sError = '<b>Komunikat</b>: '.$error->getMessage().'<br /><b>Plik</b>: '.$error->getFile().'<br /><b>Wiersz</b>: '.$error->getLine();
  64. }
  65.  


Ten post edytował boosik01 30.05.2011, 18:39:46
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ok.
Wywalić i użyc PDO
Go to the top of the page
+Quote Post
melkorm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Nie zaczynaj od pisania, zacznij od czytania / przeglądania gotowych już komponentów.

Tematów na temat `[Ocena]Moja super klasa do obsługi baz danych` było mnóstwo i w kilku niektórzy znaleźli trochę czasu i napisali wiele porad jak taka klasa w ogóle powinna wyglądać, a najlepiej przejrzyj sobie źródła już istniejących modułów do obsługi baz danych, jak np. PDO o którym już wspomniał wookieb.

P.S. Kod to nie ZOO, więc małpą mówimy NIE, szczerze aż dziw bierze że to jeszcze istnieje i jest używane _^_.

Ten post edytował melkorm 30.05.2011, 19:19:42
Go to the top of the page
+Quote Post
boosik01
post
Post #4





Grupa: Zarejestrowani
Postów: 91
Pomógł: 1
Dołączył: 19.08.2009

Ostrzeżenie: (10%)
X----


PDO jest klasą samą w subie tak? Więc pisanie klasy do obsługi bazy danych odpada więc to jest + bo mogę się już zabrać od razu za rejestrację etc...

Do tego dobra obsługa wyjątków, brak ataków sql Injection no, no ciekawe (IMG:style_emoticons/default/biggrin.gif)

Ok napisałem klasę do łatwej obsługi PDO (IMG:style_emoticons/default/wink.gif)

  1. <?php
  2.  
  3. class datebase
  4. {
  5. private $sSql ;
  6. private $pdo ;
  7. public function __construct($sSql = NULL)
  8. {
  9. $this->host = $sSql = 'localhost' ; // Host bazy danych.
  10. $this->user = $sSql = 'root' ; // Użytkownik bazy danych.
  11. $this->password = $sSql = '' ; // Hasło do bazy danych.
  12. $this->db = $sSql = 'test' ; // Wybór bazy.
  13. $this->pdo = $pdo = NULL ;
  14. try
  15. {
  16. $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db.'', $this->user, $this->password);
  17. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  18. }
  19. catch(PDOException $e)
  20. {
  21. echo '<b>Kominikat:</b> Połączenie nie mogło zostać utworzone. <br> <b>Info:</b> ' . $e->getMessage() . ' <br> <b>Wiersz:</b> ' . $e->getLine(). ' <br> <b>Plik: </b> ' .$e->getFile() ;
  22. }
  23.  
  24. }
  25.  
  26. public function __destruct()
  27. {
  28. $sSql = NULL ;
  29. }
  30.  
  31. public function select($select)
  32. {
  33. try
  34. {
  35. $this->select = $select ;
  36. $this->select = $this->pdo -> query($this->select);
  37. return $this->select->fetch();
  38.  
  39. $this->select -> closeCursor();
  40. }
  41. catch(PDOException $e)
  42. {
  43. echo '<b>Kominikat:</b> Bład z pobieraniem danych! <br> <b>Info:</b> ' . $e->getMessage() . ' <br> <b>Wiersz:</b> ' . $e->getLine(). ' <br> <b>Plik: </b> ' .$e->getFile() ;
  44. }
  45. }
  46.  
  47. public function update($update)
  48. {
  49. try
  50. {
  51. $this->update = $update ;
  52. return $this-> pdo -> exec($this->update);
  53.  
  54. $this->update -> closeCursor();
  55. }
  56. catch(PDOException $e)
  57. {
  58. echo '<b>Kominikat:</b> Bład z aktualizowaniem rekordu! <br> <b>Info:</b> ' . $e->getMessage() . ' <br> <b>Wiersz:</b> ' . $e->getLine(). ' <br> <b>Plik: </b> ' .$e->getFile() ;
  59. }
  60. }
  61.  
  62. }
  63.  
  64. $new = new datebase() ;
  65.  
  66. $new->update("UPDATE `users` SET `user` = 'asdasss11sssssssd'");
  67.  


Wszystko działa jak należy, chodź pewnie ta klasa i tak jest daleka od ideału i jeśli wgl ta klasa trzyma jakieś standardy (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Rozszerz PDO po prostu.
http://pl2.php.net/manual/en/keyword.extends.php
I naucz się formatować kod.
Tutaj nie ma co oceniać bo wszystko jest Nie tak.
Poza tym sprawdź czy ona naprawdę działa bo tu błąd na błędzie.
Go to the top of the page
+Quote Post
boosik01
post
Post #6





Grupa: Zarejestrowani
Postów: 91
Pomógł: 1
Dołączył: 19.08.2009

Ostrzeżenie: (10%)
X----


Kod jest przecież sformatowany ;p Przynajmniej u mnie w notepad++.

Ok PDO rozszerzyłem.

PS. Wszystko to tzn. co? Prosze o jakieś wskazówki czy coś (IMG:style_emoticons/default/smile.gif)

Mało w sieci jest klas obsługi PDO, zaś patrząc na inne to też mam podobnie...
Go to the top of the page
+Quote Post
konole
post
Post #7





Grupa: Zarejestrowani
Postów: 275
Pomógł: 32
Dołączył: 21.03.2006
Skąd: Warszawa

Ostrzeżenie: (20%)
X----


Cytat(boosik01 @ 31.05.2011, 07:46:22 ) *
Kod jest przecież sformatowany ;p Przynajmniej u mnie w notepad++.

Ok PDO rozszerzyłem.

PS. Wszystko to tzn. co? Prosze o jakieś wskazówki czy coś (IMG:style_emoticons/default/smile.gif)

Mało w sieci jest klas obsługi PDO, zaś patrząc na inne to też mam podobnie...

A po co ci klasa do obsługi PDO? PDO jest napisane w OOP przecież.
Go to the top of the page
+Quote Post
boosik01
post
Post #8





Grupa: Zarejestrowani
Postów: 91
Pomógł: 1
Dołączył: 19.08.2009

Ostrzeżenie: (10%)
X----


Pnieważ caly czas w każdym pliku musiałbym dołączać try{}catch{}, a druga sprawa by pobrać jakieś dane trzeba maznąć tyle kodu:

  1. <?php
  2.  
  3. try
  4. {
  5. $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'root', 'root');
  6. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.  
  8. $stmt = $pdo -> query('SELECT id, nazwa, opis FROM produkty');
  9. echo '<ul>';
  10. foreach($stmt as $row)
  11. {
  12. echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
  13. }
  14. $stmt -> closeCursor();
  15. echo '</ul>';
  16. }
  17. catch(PDOException $e)
  18. {
  19. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  20. }
  21. ?>


Czy nie lepiej napisać sobie sobie rozszerzenie klasy PDO która by to załatwiała w jednej linijce no ewentualnie w dwóch ;p ?

Ten post edytował boosik01 31.05.2011, 08:12:01
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Pnieważ caly czas w każdym pliku musiałbym dołączać try{}catch{}
Jeżeli nie masz potrzeby by obsługiwać błędy możesz całą stronę objąć jednym blokiem try..catch.
Cytat
a druga sprawa by pobrać jakieś dane trzeba maznąć tyle kodu
Nie wiem czy zauważyłeś, ale do pobrania danych wykorzystałeś... jedną linię kodu.
Cytat
Czy nie lepiej napisać sobie sobie rozszerzenie klasy PDO która by to załatwiała w jednej linijce no ewentualnie w dwóch ;p ?
Tak patrzę na ten Twój wynalazek sprzed kilku postów... nie, nie lepiej. Bo pozbawiłeś się tam jakiejkolwiek kontroli czy możliwości ingerencji w pobieranie danych.

Jeżeli już chcesz udostępnić sobie jakąś warstwę abstrakcji ponad PDO (które rzeczywiście nie ma jakiegoś idealnego interfejsu) skorzystaj lepiej z jakiegoś gotowego rozwiązania, np. Doctrine DBAL, bo na pisanie swoich jeszcze nie jesteś gotowy.
Go to the top of the page
+Quote Post
gac3k
post
Post #10





Grupa: Zarejestrowani
Postów: 90
Pomógł: 8
Dołączył: 28.07.2009

Ostrzeżenie: (0%)
-----


Ja się jeszcze przyłączę do dyskusji, bo niepotrzebnie starasz się zrobić z psa, hipopotama. Akurat w kwestii obsługi baz danych jest tyle gotowych rozwiązań że niepotrzebne jest pisanie nowych, a tym bardziej kiepskich jak ta wyżej (IMG:style_emoticons/default/smile.gif)

Masz właśnie PDO, ale masz też np. PEAR DB, ADO DB już o wszelakiej maści ORM-ach, bez których w tym momencie nie wyobrażam sobie pracy, nie wspomnę.

Jak już koniecznie chcesz mieć własną klasę to tak jak wspominali koledzy wyżej rozszerzaj to PDO, czy jakąkolwiek inną klasę, ale są one już w sobie tak bogate że ciężko mi sobie wyobrazić jakieś specjalne ficzery które można by dodać.
Go to the top of the page
+Quote Post
sarxos
post
Post #11





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 15.06.2011

Ostrzeżenie: (0%)
-----


Uwierz mi, że nie ma sensu pisania własnej klasy do obsługi bazy danych. Zgodzę się z przedmówcami i tak samo doradzę - użyj PDO! Jeśli dziedziczenie nie pasuje ponieważ chcesz stworzyć tylko DAO do abstrakcji danych, to zrób sobie nową klasę, najlepiej aby implementowała interfejs, w którym wylistujesz wszystkie wymagane przez Ciebie metody. Pod spodem jednak tez najbardziej opłaca się użyć PDO lub MDB2 z repozytorium PEAR jeśli masz PHP 5.0 bez PECL-owego modułu dla PDO ;]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:19