Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa do obsługi bazy danych...poprawcie
Joachim Peters
post
Post #1





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Od niedawna dopiero zaczełem interesować się php5 i dzisiaj napisałem sobie taką klase do obsługi bazy danych:

  1. <?php
  2. class DB 
  3. {
  4.  private $dbc;
  5.  public $sql_queries = 0;
  6.  
  7.  public function __construct($db_user, $db_name, $db_pass, $db_host)
  8.  {
  9.  $this->dbc = @mysql_connect($db_host, $db_user, $db_pass) OR die ('Nie mogłem połączyć się z MySQL-em: ' . mysql_error() );
  10.  @mysql_select_db($db_name) OR die ('Nie udało mi się wybrać bazy danych: ' . mysql_error() );
  11.  }
  12.  
  13.  public function query($sql) 
  14.  {
  15.  $this->sql_queries++; 
  16.  return @mysql_query($sql);
  17.  }
  18.  
  19.  public function fetch($result) 
  20.  {
  21.  return mysql_fetch_array($result);
  22.  }
  23.  
  24.  public function show_query() 
  25.  {
  26.  print "<br />Zapytań SQL: <b>{$this->sql_queries}</b>";
  27.  }
  28.  
  29. }
  30. ?>


i przykład:

  1. <?php
  2. $db = new DB('root', 'user', 'pass', 'localhost');
  3.  
  4. $sql = "SELECT * FROM table";
  5. $result = $db->query($sql);
  6.  
  7. while($row = $db->fetch($result)) 
  8. {
  9. echo $row['cos'];
  10. }
  11.  
  12. $db->show_query();
  13. ?>


tak jak pisałem wyżej, dopiero zaczynam z php5 więć moge robić błędy...proszę o pisanie co jest w tej klasie żle napisane i uwagi co moge dodać.

Pozdrawiam
Go to the top of the page
+Quote Post
pawel_k
post
Post #2





Grupa: Zarejestrowani
Postów: 211
Pomógł: 3
Dołączył: 29.07.2005
Skąd: Szczebrzeszyn

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


najlepiej zmienna ktora zwraca mysql_query trzymaj w klasie lub zwracaj obiekt na ktorym bedziesz robil fetch() (lub false gdy zle zapytanie), inaczej nie masz pewnosci ze metoda fetch sie wykona bez wywalania bladow...

poza tym brak przenoszalnosci pomiedzy bazami...

dalej to robienie die() gdy nie ma polaczenia z baza...

do tego dorzucilbym jeszcze przejscie na singletona smile.gif

a tak btw. to lepiej zainteresowac sie gotowym rozwiazaniem, polecam creole winksmiley.jpg

Ten post edytował pawel_k 9.08.2006, 10:39:51
Go to the top of the page
+Quote Post
athabus
post
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


d@ro - jakiś czas temu też próbowałem napisać coś do obsługi danych. Wydaje mi się, że powinieneś zadbać a kilka rzeczy:
- możliwość iterowania wyników zapytania
- możliwość informowania jakie zapytania zostały wykonane itp.

Moim zdaniem warto również zadbać o możliwość cachowania wyników - ja akurat tworzyłem rozwiązanie dla PostgreSql i były wyniki zachęcające - co do Mysql'a zdania były podzielone czy to daje jakiś wzrost efektywności - mi wydaję się, że tak, ale nie testowałem.

Tutaj moje rozwiązanie

Nie jest to nic wielkiego i trzeba na pewno jeszcze pare rzeczy dodać, ale na początek jest ok. Oczywiście takie rzeczy warto pisać dla wprawy, bo zazwyczaj gotowe rozwiązania są dużo lepsze - mądrzy ludzie nad nimi pracują biggrin.gif
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


A gdzie wyjatki? Dla mnie troche dziwnym pomyslem jest obecnie przy programownaniu OOP dawac die, czy zwracac false zamiast zwracac wyjatku.


--------------------
Go to the top of the page
+Quote Post
Joachim Peters
post
Post #5





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Wyjątki...czyli jak to powinno wyglądać?

  1. <?php
  2. $this->dbc = @mysql_connect($db_host, $db_user, $db_pass);
  3. if(!$this->dbc) {
  4. throw new Exception();
  5. }
  6. mysql_select_db($db_name);
  7. ?>


i przykład

  1. <?php
  2. try {
  3. $db = new DB('root', 'user', 'pass', 'localhost');
  4. } catch(Exception $e) {
  5. die('blad');
  6. }
  7. ?>


tak?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Nie!!!
1. Zrob tak zebys nie mial zadnego die() w bibliotece
2.
  1. <?php
  2. if(!$this->dbc) {
  3. throw new Exception();
  4. }
  5. ?>

to nie tak sie robi,
  1. <?php
  2. try
  3. {
  4. $x = new DB(...)
  5. ....
  6. $x->query()....
  7. }
  8. catch( TwojException $e )
  9. {
  10.  ....zrob cos gdy baza "nie dziala"
  11. }
  12. ?>

ma wyrzucic wyjatek gdy nie moze sie polaczyc/ wybrac bazy danych.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Joachim Peters
post
Post #7





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Czym mam zastąpić to?
  1. <?php
  2. TwojException
  3. ?>

questionmark.gif
Go to the top of the page
+Quote Post
SongoQ
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Czym chcesz przewaznie nadaje sie nazwe klasy ktora wyrzuca wyjatek clasa A => AException ale to zalezy od Ciebie jak sobie nazwiesz.


--------------------
Go to the top of the page
+Quote Post
Joachim Peters
post
Post #9





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Mam teraz tak
  1. <?php
  2.  
  3. class DB 
  4. {
  5.  private $dbc;
  6.  public $sql_queries = 0;
  7.  
  8.  public function __construct($db_user, $db_name, $db_pass, $db_host)
  9.  {
  10.  $this->dbc = @mysql_connect($db_host, $db_user, $db_pass);
  11.  mysql_select_db($db_name);
  12.  }
  13.  
  14.  public function query($sql) 
  15.  {
  16.  $this->sql_queries++; 
  17.  return @mysql_query($sql);
  18.  }
  19.  
  20.  public function fetch($result) 
  21.  {
  22.  return mysql_fetch_array($result);
  23.  }
  24.  
  25. public function show_query() 
  26.  {
  27.  print "<br />Zapytań SQL: <b>{$this->sql_queries}</b>";
  28.  }
  29.  
  30.  public function close()
  31.  {
  32.  return mysql_close();
  33.  }
  34.  
  35. }
  36.  
  37.  
  38. try
  39. {
  40. $db = new DB('root', '', '', 'localhost');
  41.  
  42. $sql = "SELECT * FROM table";
  43. $result = $db->query($sql);
  44.  
  45. while($row = $db->fetch($result)) 
  46. {
  47. echo $row['cos'];
  48. }
  49.  
  50. $db->show_query();
  51. $db->close();
  52.  
  53. } catch( DBException $e )
  54. {
  55. die('blad');
  56. }
  57.  
  58. ?>


i wywala mi
Fatal error: Class 'DBException' not found in index.php on line 52
co robie zle?

Ten post edytował d@ro 10.08.2006, 07:55:14
Go to the top of the page
+Quote Post
mike
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


A masz zdaefiniowaną klasę DBException ?

Jak nie masz to napisz sobie. Pamiętaj że musi ona dziedziczyć po klasie z Exception z biblioteki SPL.

P.S.
Exceptions :: Extending Exceptions
Go to the top of the page
+Quote Post
Ludvik
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Poza tym wypadało by wyrzucić wyjątek zanim zechcesz go przechwycić. Zapoznaj się z mechanizmem wyjątków.

Póki co, to ta klasa komplikuje Ci tylko całą sytuację. Nie implementuje całego interfejsu mysql. Skończy się to tym, że będziesz na przemian używał tej klasy i funkcji mysql_*. Jedyną rzeczą, którą wykonuje ta klasa inaczej niż rozszerzenie to zliczanie zapytań.

Fetch nie należy do interfejsu połączenia z bazą. Dane pobierasz z wyniku zwróconego przez bazę.


--------------------
Go to the top of the page
+Quote Post
Joachim Peters
post
Post #12





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Zrobiłem coś na podstawie tego co @Ludvik napisał mi w innym temacie o bazie danych.

  1. <?php
  2.  
  3.  
  4. class DB 
  5. {
  6.  public $sql_queries = 0;
  7.  
  8.  public function __construct($db_user, $db_name, $db_pass, $db_host)
  9.  {
  10.  $this->handle = mysql_connect($db_host, $db_user, $db_pass);
  11.  if (!$this->handle) {
  12.  throw new Exception();
  13.  }
  14.  mysql_select_db($db_name, $this->handle);
  15.  }
  16.  
  17.  public function query($sql) 
  18.  {
  19.  $this->sql_queries++; 
  20.  return @mysql_query($sql);
  21.  }
  22.  
  23.  public function fetch($result) 
  24.  {
  25.  return mysql_fetch_array($result);
  26.  }
  27.  
  28.  public function show_query() 
  29.  {
  30.  print "<br />Zapytań SQL: <b>{$this->sql_queries}</b>";
  31.  }
  32.  
  33.  public function close()
  34.  {
  35.  return mysql_close();
  36.  }
  37.  
  38. protected $handle;
  39.  
  40. }
  41.  
  42. try {
  43. $db = new DB('root', '', '', 'localhost');
  44. } catch(Exception $e) {
  45. die ('Nie można nawiązać połączenia z bazą danych.');
  46. }
  47.  
  48. $sql = "SELECT * FROM ttt";
  49. $result = $db->query($sql);
  50.  
  51. while($row = $db->fetch($result)) 
  52. {
  53. echo $row['cos'];
  54. }
  55.  
  56. $db->show_query();
  57.  
  58.  
  59. ?>


ale teraz gdy nie ma połączenia z bazą (złe dane) to nic się nie dzieje oprócz wywalenia błędu odnośnie fetch'a.

probowałem też coś takiego

  1. <?php
  2.  
  3.  
  4. class DB 
  5. {
  6.  private $dbc;
  7.  public $sql_queries = 0;
  8.  
  9.  public function __construct($db_user, $db_name, $db_pass, $db_host)
  10.  {
  11.  $this->dbc = mysql_connect($db_host, $db_user, $db_pass);
  12.  mysql_select_db($db_name);
  13.  }
  14.  
  15.  public function query($sql) 
  16.  {
  17.  $this->sql_queries++; 
  18.  return @mysql_query($sql);
  19.  }
  20.  
  21.  public function fetch($result) 
  22.  {
  23.  return mysql_fetch_array($result);
  24.  }
  25.  
  26.  public function show_query() 
  27.  {
  28.  print "<br />Zapytań SQL: <b>{$this->sql_queries}</b>";
  29.  }
  30.  
  31.  public function close()
  32.  {
  33.  return mysql_close();
  34.  }
  35.  
  36. }
  37.  
  38. class DBException extends Exception {};
  39.  
  40. try {
  41. $db = new DB('root', '', '', 'localhost');
  42. } catch(DBException $e) {
  43. die ('Nie można nawiązać połączenia z bazą danych.');
  44. }
  45.  
  46. $sql = "SELECT * FROM tabbe";
  47. $result = $db->query($sql);
  48.  
  49. while($row = $db->fetch($result)) 
  50. {
  51. echo $row['title'];
  52. }
  53.  
  54. $db->show_query();
  55.  
  56.  
  57. ?>


ale jest tak samo..proszę o pomoc

Ten post edytował d@ro 10.08.2006, 16:22:26
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 16:03