Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Moja klasa do obsługi baz danych
Forum PHP.pl > Inne > Oceny
sweter
Witam,
wykonałem taką klasę do obsługi DB:
  1. class db{
  2.  
  3. protected $query;
  4. protected $no = 4;
  5. protected $limit;
  6. protected $table;
  7. protected $offset;
  8. protected $columns;
  9. protected $group;
  10. protected $where = "";
  11. protected $order;
  12. protected $columns_query;
  13. private $connection;
  14.  
  15.  
  16. public function __construct(){
  17.  
  18. $this->connection = mysql_connect('127.0.0.1','root','p');
  19. mysql_select_db('test');
  20.  
  21.  
  22. $this->columns_query = array();
  23. $this->query = "SELECT * FROM ".$this->table." ";
  24. foreach($this->columns AS $col){
  25. $this->columns_query[] = $col[0];
  26. }
  27.  
  28.  
  29. }
  30.  
  31. public function __destruct(){
  32. mysql_close($this->connection);
  33. }
  34.  
  35.  
  36.  
  37. public function getColumns($value){
  38. $query = "SELECT ";
  39. $order = "";
  40. $this->columns_query = array();
  41. foreach($value AS $col){
  42. $query .= $col.", ";
  43. $this->columns_query[] = $col;
  44. }
  45. $query = substr($query, 0, -2);
  46. $query .= " FROM ".$this->table." ";
  47. $this->query = $query;
  48. return $this;
  49. }
  50.  
  51. private function columnExist($start, $name){
  52. $find = false;
  53. for($q=0; $q<$this->no; $q++){
  54. if($this->columns[$q][0]==strtolower(substr($name, $start, strlen($this->columns[$q][0])))){
  55. $find = true;
  56. return strtolower(substr($name, $start, strlen($this->columns[$q][0])));
  57. }
  58. }
  59. return $find;
  60. }
  61.  
  62. public function __call($name, $value){
  63. if(substr($name, 0, 8)=="filterBy"){
  64. $col = $this->columnExist(8, $name);
  65. if($col!=1){
  66. $this->where .= $col."='".$value[0]."' AND ";
  67. }else{
  68. echo "<pre>I can't find column named '".strtolower(substr($name, 8, strlen($name)-8))."'</pre>";
  69. }
  70. }else if(substr($name, 0, 7)=="orderBy"){
  71. $col = $this->columnExist(7, $name);
  72. if($col!=1){
  73. $this->order = "ORDER BY ".$col." ".strtoupper($value[0]);
  74. }else{
  75. echo "<pre>I can't find column named '".strtolower(substr($name, 8, strlen($name)-8))."'</pre>";
  76. }
  77. }else if($name=="setLimit"){
  78. $this->limit = $value[0];
  79. }else if($name=="setOffset"){
  80. $this->offset = $value[0];
  81. }else if(substr($name, 0, 7)=="groupBy"){
  82. $col = $this->columnExist(7, $name);
  83. if($col!=1){
  84. $this->group = $col;
  85. }
  86. }
  87. return $this;
  88. }
  89.  
  90. public function where($where){
  91. $this->query .= "(".$where.") AND ";
  92. return $this;
  93. }
  94.  
  95. public function find(){
  96.  
  97.  
  98. if(strlen($this->where)>0){
  99. $this->where = substr($this->where, 0, -5);
  100. $this->query .= "WHERE ".$this->where." ";
  101. }
  102.  
  103.  
  104. if($this->group!=NULL){
  105. $this->query .= "GROUP BY ".$this->group." ";
  106. }
  107.  
  108. $this->query .= $this->order." ";
  109.  
  110. if($this->offset!=NULL || $this->limit!=NULL){
  111. $this->query .= "LIMIT ";
  112. if($this->offset!=NULL){
  113. $this->query .= $this->offset.",";
  114. }else{
  115. $this->query .= "0,";
  116. }
  117. if($this->limit!=NULL){
  118. $this->query .= $this->limit;
  119. }else{
  120. $this->query .= "0";
  121. }
  122. }
  123.  
  124. echo "Wykonuję zapytanie o treści:<br />".$this->query."<br />";
  125.  
  126. $query = mysql_query($this->query);
  127.  
  128. $return = array();
  129. $q = 0;
  130. while($row = mysql_fetch_array($query)){
  131. foreach($this->columns_query AS $col){
  132. $return[$q][$col] = $row[$col];
  133. }
  134. $q++;
  135. }
  136. return $return;
  137.  
  138. }
  139.  
  140.  
  141. }

Każda tabela z bazy danych musi być reprezentowana, przez jedną klasę, dziedziczącą po powyższej klasie. Przykładowo:
  1. class db_uzytkownicy extends db{
  2. protected $no = 4; // ilość kolumn w tabeli
  3. protected $table = "uzytkownicy"; // nazwa tabeli w bazie danych
  4.  
  5. // spis kolumn w tabeli
  6. protected $columns = array(
  7. array('id', 'INT', 10), // nazwa, typ, długość
  8. array('imie', 'VARCHAR', 255),
  9. array('email', 'VARCHAR', 255),
  10. array('nazwisko', 'VARCHAR', 255),
  11. );
  12.  
  13. }


Jak oceniacie powyższy kod? Proszę o surowe i konstruktywne opinie: co poprawić, co polepszyć, co usunąć?
Pozdrawiam smile.gif
IceManSpy
Nie powinno być echo w metodach klasy. Bo jeśli bym chciał to wykorzystać to po co ktoś ma patrzyć jakie zapytanie zostało wykonane?
Co się stanie jak ilość kolumn będzie inna niż rzeczywista ilość?
sweter
Ad. 1: to jest wersja robocza i dlatego to echo tam jest smile.gif
Ad. 2: no to powiedzmy, że dodam
  1. $this->no = count($this->columns);

do kontruktora smile.gif
greycoffey
  1.  
  2. // [1]...
  3. $this->connection = mysql_connect('127.0.0.1','root','p');
  4. mysql_select_db('test');
  5.  
  6. // [2]...
  7. private function columnExist($start, $name){
  8. $find = false;
  9. for($q=0; $q<$this->no; $q++){
  10. if($this->columns[$q][0]==strtolower(substr($name, $start, strlen($this->columns[$q][0])))){
  11. $find = true;
  12. return strtolower(substr($name, $start, strlen($this->columns[$q][0])));
  13. }
  14. }
  15. return $find;
  16. }


Kawałek kodu nr 1. - Sztywno ustawiane dane do połączenia.
Kawałek kodu nr 2. - zmienna $find tutaj nie ma sensu. Można to zapisać również tak:
  1. private function columnExist($start, $name){
  2. for($q=0; $q<$this->no; $q++){
  3. if($this->columns[$q][0]==($ret=strtolower(substr($name, $start, strlen($this->columns[$q][0]))))){
  4. return $ret;
  5. }
  6. }
  7. return false;
  8. }


Czasami definiujesz niepotrzebne zmienne, nie używasz przestrzeni nazw (na początku się tak nie wydaje, ale są bardzo przydatne, poczytaj też o PSR-0), nazwy klas zaczyna się zazwyczaj dużą literą.
Zyx
Klasa napisana jest beznadziejnie z punktu projektowania obiektowego. Mieszasz funkcjonalności, próbując wszystko wrzucić do jednego wora, dodatkowo robisz trywialne błędy związane z algorytmami, co już zauważyli koledzy wyżej. Dodatkowo, w kodzie nawet nie raczysz sprawdzić czy zapytanie w ogóle się wykonało. Powiedz mi: dlaczego uważasz, że klasa do obsługi baz danych powinna jednocześnie:
- Zarządzać konfiguracją połączenia
- Zarządzać wykonywaniem zapytań
- Zarządzać składaniem zapytań SELECT

To są trzy różne rzeczy. Do pierwszej masz system konfiguracji, do drugiej - PDO już wbudowane w PHP, zostaje Ci trzecie.
.radex
Nie będę powtarzał Zyxa, dodam tylko od siebie, że kod jest mało czytelny... Spacje wokół operatorów, klamerka otwierająca w nowej linii, puste linie rozdzielające poszczególne części metody, podzielenie długich linii na dwie, a przede wszystkim komentarze — to na prawdę nie boli, a niesamowicie podnosi czytelność kodu. Podczas pisania może nie zauważysz wielkiej różnicy, ale jak przyjdzie Ci edytować ten kod za pół roku to będziesz żałował wink.gif
itsme
Dobrze ze się chwalisz czym napisałeś i doceniam Twoją odwagę gdyż to środowisko do negacji jest pierwsze. Co nie oznacza że powyższe posty są nieprawidłowe, negatywne same w sobie. Ja piszę o ogólnym zachowaniu użytkowników forum.
Zatem poczytaj negatywne uwagi i wyciągnij wnioski ważne abyś sie nie poddawał lecz rozwijał dalej.

sweter
Bardzo dziękuję za opinie, komentarze oraz rady smile.gif
Dokonałem drobnych zmian i teraz konstruktor wygląda tak:
  1. $data = parse_ini_file('connection.ini');
  2.  
  3. $this->connection = mysql_connect($data['host'], $data['login'], $data['password']);
  4. mysql_select_db($data['db']);
  5.  
  6. $this->columns_query = array();
  7. $this->query = "SELECT * FROM ".$this->table." ";
  8. foreach($this->columns AS $col){
  9. $this->columns_query[] = $col[0];
  10. }


@Zyx:
Cytat
- Zarządzać konfiguracją połączenia

Jak widzisz dane konfiguracyjne przeniosłem do pliki .ini - oto Tobie chodziło, czy nie? Jeżeli nie, to jeśli możesz napisz jak powinno to wyglądać.
Jeśli chodzi Ci o PDO, to zrezygnowałem z niego, ponieważ pisząc tą klasę miałem tylko w intencji potrenować OOP i nic więcej smile.gif

@.radex
Cytat
kod jest mało czytelny... Spacje wokół operatorów, klamerka otwierająca w nowej linii, puste linie rozdzielające poszczególne części metody, podzielenie długich linii na dwie, a przede wszystkim komentarze

Co do tych pustych linii i komentarzy to się z Tobą zgodzę. Ciągle nadużywam tego pierwszego, a zapominam o tym drugim.
Ale odnośnie wymienionych dwóch pozostałych cech - tak się nauczyłem pisać i tak jest mi wygodnie tongue.gif

Widzę, że od ponad doby nikt się nie odezwał, więc to już wszystkie niezgodności, które odkryliście?
Pozdrawiam
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.