Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa do obsługi mySQL.
Forum PHP.pl > Forum > PHP > Object-oriented programming
boosik01
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.  
wookieb
Ok.
Wywalić i użyc PDO
melkorm
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 _^_.
boosik01
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 biggrin.gif

Ok napisałem klasę do łatwej obsługi PDO 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 tongue.gif
wookieb
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.
boosik01
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ś smile.gif

Mało w sieci jest klas obsługi PDO, zaś patrząc na inne to też mam podobnie...
konole
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ś 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ż.
boosik01
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 ?
Crozin
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.
gac3k
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 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ć.
sarxos
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 ;]
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.