Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa MySQL
Starmi
post 22.12.2012, 14:13:35
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 22.12.2012

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


Witam.
Mam na imię Tomek, lat mam 15 skończone 11 grudnia.
PHP zajmuje się parę miesięcy a OOP może miesiąc, akurat tym językiem, ponieważ uważam że on jest jak dla mnie najłtawiejszy smile.gif

Napisałem klasę MySQL w celu edukacyjnym, Proszę o ocene.
Krytyka jak najmilej widziana ( Tylko nie do przesady ). smile.gif

  1. <?php error_reporting( E_ALL ^ E_NOTICE );
  2. // +---------------------------------------------------------------------------+
  3. // | Copyright (c) 2012 Starmi |
  4. // +---------------------------------------------------------------------------+
  5. class Db
  6. {
  7. /**
  8. * @var array tablica zawierające dane typu host/user/base/pass itp...
  9. */
  10. var $_params = array();
  11.  
  12. /**
  13. * @var bool Czy klasa jest połączona z bazą danych
  14. */
  15. var $_connect = false;
  16.  
  17. /**
  18. * @var link Uchwyt połaczenia bazy danych
  19. */
  20. var $_connect_link = null;
  21.  
  22. /**
  23. * @var resource_id Uchwyt ostatniego zapytania mysql
  24. */
  25. var $_last_query = null;
  26.  
  27. /**
  28. * Zmienia dane w zmiennej globalnej $_params
  29. *
  30. * @param array|string $name klucz lub tablica
  31. * @param string $value jeśli $name nie jest tablicą to używany tej zmiennej do przypisania wartości
  32. * @return bool zwraca czy dane zostały poprawnie zmienione/dodane do $_params
  33. * @acces public
  34. */
  35. function setParam( $name, $value = null )
  36. {
  37. if( is_null($name) )
  38. {
  39. return false;
  40. }
  41.  
  42. if( is_array($name) )
  43. {
  44. foreach($name as $key => $value)
  45. {
  46. if( empty($key) || empty($value) )
  47. {
  48. continue;
  49. }
  50.  
  51. $this -> _params[ $key ] = $value;
  52.  
  53. }
  54. return true;
  55. }
  56.  
  57. $this -> _params[ $name ] = $value; return true;
  58. }
  59.  
  60. /**
  61. * Funkcja pobiera dane z tablicy globalnej $_params
  62. *
  63. * @param array|string klucz lub tablica zawierająca klucze...
  64. * @return array|string zwraca wyniki
  65. * @acces public
  66. */
  67. function getParam( $param = null )
  68. {
  69. if( is_array($param) )
  70. {
  71. $_return = array();
  72. foreach($param as $param_key)
  73. {
  74. if( isset($this->_params[ $param_key ]) && !is_null($param_key) )
  75. {
  76. $_return[ $param_key ] = $this -> _params[$param_key];
  77. }
  78. else continue;
  79. }
  80. return $_return;
  81. }
  82.  
  83. return $this -> _params[$param];
  84. }
  85.  
  86. /**
  87. * Funkcja odpowiadająca za łączenie z bazą danych
  88. *
  89. * @return bool Zwraca wynik połączenia...
  90. * @acces public
  91. */
  92. function connect()
  93. {
  94. $db = $this -> getParam(array('host', 'user', 'pass', 'base'));
  95.  
  96. if( ($connect_id = @mysql_connect($db['host'], $db['user'], $db['pass']) ) )
  97. {
  98. if( @mysql_select_db($db['base'], $connect_id) )
  99. {
  100. $this -> _connect = true;
  101. $this -> _connect_link = $connect_id;
  102. return true;
  103. }
  104. else
  105. {
  106. $this -> writeError('Nie można wybrać bazy danych...');
  107. }
  108. }
  109. else
  110. {
  111. $this -> writeError('Nie można połączyć się z bazą danych');
  112. }
  113. }
  114.  
  115. /**
  116. * Wypisuje błąd na stronie
  117. *
  118. * @param string $error błąd do wyświetlenia
  119. * @return bool wysyła wartość zwróconą przez trigger_error()
  120. */
  121. function writeError( $error ){
  122. return trigger_error($error, E_USER_ERROR);
  123. }
  124.  
  125. /**
  126. * Wysyła zapytanie do MySQL
  127. *
  128. * @param string $query_string string jaki zostanie wysłany do mysql
  129. * @param bool $fetch czy zwrócić tablice z wynikami ['fetch']
  130. * @param bool $rows czy zwrócić ilość rekordów w bazie danych ['rows']
  131. * @return bool|array false jeśli zapytanie się nie powiedzie, array jeśli tak
  132. * @acces publoc
  133. */
  134. function query( $query_string = null, $fetch = FALSE, $rows = FALSE )
  135. {
  136. if( is_null($query_string) )
  137. {
  138. return false;
  139. }
  140.  
  141. unset( $this -> _last_query );
  142. if( $query = @mysql_query($query_string, $this->_connect_link) )
  143. {
  144. $this -> _last_query = $query;
  145. switch( TRUE )
  146. {
  147. case $fetch:
  148. $_return['fetch'] = mysql_fetch_array( $this -> _last_query );
  149. break;
  150. case $rows:
  151. $_return['rows'] = mysql_num_rows( $this -> _last_query );
  152. break;
  153. }
  154. $_return['handle'] = $this -> _last_query;
  155. return $_return;
  156. }
  157. else
  158. {
  159. $this -> writeError( 'Nie można wykonać zapytania mysql </br>Zapytanie: ' . $query_string );
  160. }
  161. }
  162.  
  163. /**
  164. * Dodaje rekord do bazy danych
  165. *
  166. * Możesz użyć funkcji query, ale po co? ta jest łatwiejsza ! biggrin.gif Nie zwraca żadnej wartości
  167. *
  168. * @param string $table tabela do jakies ma zostać dodany rekord
  169. * @param array $insert_data dane jakie zostaną dodane np: array('kolumna' => 'wartość')
  170. */
  171. function insert( $table, $insert_data )
  172. {
  173. $this -> query( sprintf("INSERT INTO `%s` (`%s`) VALUES(\"%s\")",
  174. $table,
  175. implode('`, `', array_keys($insert_data)),
  176. implode('", "', addslashes(array_values($insert_data))
  177. )));
  178. }
  179.  
  180.  
  181. }
  182.  
  183. /** Przykład użycia... **/
  184. $db = new Db();
  185. $db -> setParam('host', 'localhost');
  186. $db -> setParam('pass', '');
  187. $db -> setParam('user', 'root');
  188. $db -> setParam('base', 'test');
  189. $db -> connect();
  190.  

Temat ten sam napisałem w dziale php lecz niestety on został zamknięty smile.gif Ponieważ moderator nie zrozumiał posta, a ja chciałem tylko ocenę smile.gif
Go to the top of the page
+Quote Post
jasin
post 22.12.2012, 14:31:14
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

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


var? Chyba nieporozumienie. Gdzie public, protected, private? Poczytaj o standardzie kodowania PSR2. Jakis wzorzec projektowy terz by sie przydal. Podejrzyj klasy od PDO.

Ten post edytował jasin 22.12.2012, 14:35:49


--------------------
Go to the top of the page
+Quote Post
Kofel
post 22.12.2012, 14:35:26
Post #3





Grupa: Zarejestrowani
Postów: 99
Pomógł: 22
Dołączył: 14.12.2007
Skąd: Wyszków

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


  1. $db = $this -> getParam(array('host', 'user', 'pass', 'base'));
  2.  
  3. if( ($connect_id = @mysql_connect($db['host'], $db['user'], $db['pass']) ) )


Dlaczego po prostu nie będzie to:
  1. if( ($connect_id = @mysql_connect( $this->_params['host'], $this->_params['user'], $this->_params['pass']) ) )


Zresztą... używanie metod setParam przy łączeniu się z bazą, czyni Twoją bibliotekę nie wygodną do obsługi.
Moim zdaniem, dane do dotyczące dostępu do bazy danych powinny być przekazywane do konstruktora klasy. Podobnie jest w wielu popularnych bibliotekach, np. PDO.
Używasz dość przestarzałej konstrukcji definicji klas (bodajże kiedyś, za czasów PHP4 takiej się używało). Nie ustalasz dostępu dla pół i metod (public, private/protected). Póki co masz braki z OOP.

Jestem pod wrażeniem przejrzystości kodu. Szczerze. Jeśli mówisz prawdę to masz bardzo duży progress w małym odstępie czasu.

Pozdrawiam.

EDIT:
  1. function writeError( $error ){
  2. return trigger_error($error, E_USER_ERROR);
  3. }

Rozumiem, że to obsługa błędów generowanych przez Twoją bibliotekę? Niestety takie rozwiązanie nie daje mi, jako programiście końcowemu, możliwości obsługi tych błędów.
O wiele ładniejsze rozwiązanie to wyjątki. Poczytaj o tym: http://pl1.php.net/exceptions

Ten post edytował Kofel 22.12.2012, 14:43:39
Go to the top of the page
+Quote Post
pyro
post 22.12.2012, 14:58:18
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Bez sensu zupełnie.

- Skoro jest to klasa do obsługi jednego połączenia, to po co całe te setParam(). Te wszystkie dane powinno się przekazać w konstruktorze. Nawet w przypadku, jakby była to klasa do obsługi wielu połączeń to powinna być jakaś tablica z połączeniami
  1. $db = new Db();
  2. $db->newConnection('host', 'user', 'password', 'database'); // W klasie: $this->connections[] = ...

- Po co ta metoda getParam() ? Jakby programista zapomniał jakie dane wpisał do połączenia z bazą danych w międzyczasie czy jak?
- Mało mówiące nazwy metod / pól. ($_connection, co connection? Mogłoby być coś w stylu $is_connected, setParam(), getParam() parametry czego?). Niby jest opis z PHPDoc, ale przy większych skryptach / projektach potem ciężko się połapać.
- metoda query(), a potem oddzielna dla samego INSERT? Musisz się zdecydować. Albo zostawiasz funkcję query() (tyle, że jakoś lepiej skonstruowaną), albo dla zapytań robisz oddzielne select(), insert(), update() itd.
- Brak jakichkolwiek public / protected / private. PHP4 to już przeszłość.

// ADD

Dodatkowo używanie addslashes(), zamiast (real_)escape_string();

Ten post edytował pyro 22.12.2012, 14:46:40


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
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 Wersja Lo-Fi Aktualny czas: 12.05.2024 - 06:24