Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa do obsługi bazy danych...poprawcie
Forum PHP.pl > Forum > PHP > Object-oriented programming
Joachim Peters
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
pawel_k
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
athabus
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
SongoQ
A gdzie wyjatki? Dla mnie troche dziwnym pomyslem jest obecnie przy programownaniu OOP dawac die, czy zwracac false zamiast zwracac wyjatku.
Joachim Peters
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?
dr_bonzo
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.
Joachim Peters
Czym mam zastąpić to?
  1. <?php
  2. TwojException
  3. ?>

questionmark.gif
SongoQ
Czym chcesz przewaznie nadaje sie nazwe klasy ktora wyrzuca wyjatek clasa A => AException ale to zalezy od Ciebie jak sobie nazwiesz.
Joachim Peters
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?
mike
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
Ludvik
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ę.
Joachim Peters
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
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.