Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy taki manager baz jest dobry?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Utilaft
Witam. Uczę się z eduweb php oop. I jest taka klasa obsługująca bazę danych:


  1. <?php
  2.  
  3.  
  4. class DatabaseManager {
  5.  
  6. static public function getConnection() {
  7.  
  8. $conn = @new mysqli(DB_SERVER, DB_USERNAME, DB_PW, DB_DB);
  9.  
  10. if(mysqli_connect_errno()) {
  11. $conn_errno = mysqli_connect_errno();
  12. $conn_error = mysqli_connect_error();
  13.  
  14. // W przypadku wystąpienia problemów z połączeniem, zapisz informację w pliku LOG i zakończ działanie skryptu
  15. LogFile::AddLog("Nastapił błąd połączenia numer [ $conn_errno ] z bazą danych: o treści: [ $conn_error ]", __LINE__, __FILE__);
  16. exit();
  17.  
  18. } else {
  19.  
  20. $conn->query("SET NAMES 'utf8'");
  21. return $conn;
  22.  
  23. }
  24.  
  25. }
  26.  
  27. static public function selectBySQL($SQL) {
  28.  
  29. $conn = self::getConnection();
  30. //$SQL = $conn->real_escape_string($SQL);
  31. $result = $conn->query($SQL);
  32.  
  33. if(!$result) {
  34.  
  35. LogFile::AddLog("Wystąpił błąd połączenia z bazą danych!", __LINE__, __FILE__);
  36. return false;
  37.  
  38. } else {
  39.  
  40. $resultArray = Array();
  41.  
  42. while(($row = $result->fetch_array(MYSQLI_ASSOC)) !== NULL) {
  43.  
  44. $resultArray[] = $row;
  45. }
  46.  
  47. }
  48.  
  49. if(count($resultArray) > 0) {
  50. return $resultArray;
  51. } else {
  52. LogFile::AddLog("Zapytanie bazodanowe zwróciło pusty wynik!", __LINE__, __FILE__);
  53. return false;
  54. }
  55.  
  56. mysqli_close($conn);
  57.  
  58. }
  59.  
  60. static public function selectData($TABLE, $COLUMNS = Array("*"), $WHERE = Array(), $LOGIC_OPER = "=", $OPER = "AND") {
  61.  
  62. $conn = self::getConnection();
  63.  
  64. $SQL = "SELECT ";
  65.  
  66. if(count($COLUMNS) == 1) {
  67. $SQL .= $COLUMNS[0];
  68. } else {
  69. foreach($COLUMNS as $column) {
  70. $SQL .= $column.",";
  71. }
  72. }
  73.  
  74. $SQL = rtrim($SQL, ',');
  75.  
  76. $SQL .= " FROM {$TABLE}";
  77.  
  78. if(count($WHERE) > 0) {
  79.  
  80. $SQL .= " WHERE ";
  81.  
  82. foreach($WHERE as $key => $val) {
  83. $SQL .= $key.$LOGIC_OPER."'".$val."' ".$OPER." ";
  84. }
  85.  
  86. $SQL = substr($SQL, 0, strlen($SQL)-(strlen($OPER)+2));
  87.  
  88. }
  89.  
  90. $result = $conn->query($SQL);
  91.  
  92. if(!$result) {
  93.  
  94. LogFile::AddLog("Wystąpił błąd połączenia z bazą danych!", __LINE__, __FILE__);
  95. return false;
  96.  
  97. } else {
  98.  
  99. $resultArray = Array();
  100.  
  101. while(($row = $result->fetch_array(MYSQLI_ASSOC)) !== NULL) {
  102.  
  103. $resultArray[] = $row;
  104. }
  105.  
  106. }
  107.  
  108. if(count($resultArray) > 0) {
  109. return $resultArray;
  110. } else {
  111. LogFile::AddLog("Zapytanie bazodanowe zwróciło pusty wynik!", __LINE__, __FILE__);
  112. return false;
  113. }
  114.  
  115. mysqli_close($conn);
  116.  
  117. }
  118.  
  119. static public function updateTable($TABLE, $SET, $WHERE = Array(), $OPER = "AND") {
  120.  
  121. $conn = self::getConnection();
  122.  
  123. $SQL = "UPDATE {$TABLE} SET ";
  124.  
  125. foreach($SET as $key => $val) {
  126. $SQL .= $key."='".$val."',";
  127. }
  128.  
  129. $SQL = rtrim($SQL, ',');
  130.  
  131. if(count($WHERE) > 0) {
  132.  
  133. $SQL .= " WHERE ";
  134.  
  135. foreach($WHERE as $key => $val) {
  136. $SQL .= $key."='".$val."' ".$OPER." ";
  137. }
  138.  
  139. $SQL = substr($SQL, 0, strlen($SQL)-(strlen($OPER)+2));
  140.  
  141. }
  142.  
  143. $result = $conn->query($SQL);
  144.  
  145. if($result) {
  146. return true;
  147. } else {
  148. LogFile::AddLog("Zapytanie bazodanowe UPDATE nie wykonało się poprawnie!", __LINE__, __FILE__);
  149. return false;
  150. }
  151.  
  152. mysqli_close($conn);
  153.  
  154. }
  155.  
  156. static public function deleteFrom($TABLE, $WHERE = Array(), $OPER = "AND") {
  157.  
  158. $conn = self::getConnection();
  159.  
  160. $SQL = "DELETE FROM {$TABLE}";
  161.  
  162. if(count($WHERE) > 0) {
  163.  
  164. $SQL .= " WHERE ";
  165.  
  166. foreach($WHERE as $key => $val) {
  167.  
  168. $SQL .= $key."='".$val."' ".$OPER." ";
  169.  
  170. }
  171.  
  172. $SQL = substr($SQL, 0, strlen($SQL) - (strlen($OPER)+2));
  173.  
  174. }
  175.  
  176. $result = $conn->query($SQL);
  177. if(!($result)) {
  178. LogFile::AddLog("Usunięcie elementu bazy danych było nie możliwe do zrealizowania.", __LINE__, __FILE__);
  179. return false;
  180. } else {
  181. return true;
  182. }
  183.  
  184. mysqli_close($conn);
  185.  
  186. }
  187.  
  188. static public function insertInto($TABLE, $DATA) {
  189.  
  190. $conn = self::getConnection();
  191.  
  192. $SQL = "INSERT INTO {$TABLE}";
  193. $SQL .= " (";
  194.  
  195. foreach($DATA as $key => $val) {
  196. $SQL .= $key.",";
  197. }
  198.  
  199. $SQL = rtrim($SQL, ",");
  200. $SQL .= ") ";
  201. $SQL .= "VALUES";
  202. $SQL .= " (";
  203.  
  204. foreach($DATA as $val) {
  205. $SQL .= "'".$val."',";
  206. }
  207.  
  208. $SQL = rtrim($SQL, ',');
  209. $SQL .= ")";
  210.  
  211. $result = $conn->query($SQL);
  212. if(!($result)) {
  213. LogFile::AddLog("Wstawienie nowego elementu do bazy danych zakończyło się niepowodzeniem.", __LINE__, __FILE__);
  214. return false;
  215. } else {
  216. return true;
  217. }
  218.  
  219. mysqli_close($conn);
  220.  
  221. }
  222.  
  223. }
  224.  
  225. ?>

takie przykładowe zapytanie:

DatabaseManager::selectBySQL("bla");

Dodawanie rekordów też podobnie typu tablica. W kodzie wszystko macie.

Oraz config z automatycznym ładowaniem klas.


  1. <?php
  2.  
  3. // OKREŚLENIE POŁOŻENIA STRONY W SERWISIE - DEFINICJA <BASE ... />
  4. $AbsoluteURL = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
  5. $dirCat = dirname($_SERVER['PHP_SELF']);
  6. $AbsoluteURL .= $_SERVER['HTTP_HOST'];
  7. $AbsoluteURL .= $dirCat != '\\' ? $dirCat : "";
  8. $slash = substr($AbsoluteURL, -1);
  9.  
  10. $NewURL = $slash != '/' ? $AbsoluteURL.'/' : $AbsoluteURL;
  11.  
  12.  
  13. // STAŁE DLA BAZY DANYCH
  14. define('DB_SERVER', 'localhost');
  15. define('DB_USERNAME', 'eduweb');
  16. define('DB_PW', 'eduweb2011');
  17. define('DB_DB', 'supercms');
  18.  
  19. // STAŁA DLA ADRESU I LOKALIZACJI APLIKACJI
  20. define('SERVER_ADDRESS', $NewURL);
  21.  
  22. // STAŁA DLA LOKALIZACJI KATALOGÓW I PLIKÓW
  23. define('LogFolder', 'LOG', true);
  24.  
  25. set_include_path(get_include_path(). PATH_SEPARATOR . "CLASS");
  26. set_include_path(get_include_path(). PATH_SEPARATOR . "CLASS/Managers");
  27. set_include_path(get_include_path(). PATH_SEPARATOR . "LIBRAY");
  28.  
  29. // Magiczna funkcja automatycznie ładująca klasy wg. zapotrzebowania
  30.  
  31. function __autoload($className) {
  32.  
  33. @include_once($className.".class.php");
  34.  
  35. }
  36.  
  37. ?>


Czy takie rozwiązanie jest dobre? Chciałbym używać tego, jako podstawy w moim przyszłych projektach.
Fifi209
Odpowiadam na pytanie: nie.

Mogę podać kilka powodów:

  • Nie do końca wiesz do czego służa funkcje statyczne - po prostu walisz i już
  • Czemu nie użyjesz PDO i wyjątków? Skoro ma być obiektowo...
  • Nie sprawdzasz w funkcjach czy masz połączenie z bazą, ew. wyświetlasz komunikat, że coś z bazą nie tak
  • Zwracasz z wielu funkcji false w przypadku niepowodzenia a komunikat zapisujesz w logach
  • Używasz stałych w celu połączenia z bazą zamiast przekazywać to przez konstruktor
  • Brak możliwości połączenia z kilkoma bazami naraz
  • Używasz __autoload nie wiedząc jak to ma działać, tylko dodajesz od razu ścieżki do include


Mogę mnożyć, ale zastanów się najpierw nad tym co napisałem
Adi32
Cytat(Fifi209 @ 13.03.2013, 00:20:05 ) *
[*]Używasz stałych w celu połączenia z bazą zamiast przekazywać to przez konstruktor


ManagerDB to najczęściej singleton, wtedy przekazywanie przez konstruktor odpada.
Jednak lepiej byłoby przekazywać te stałe globalną typu $config['db_default']['host']...
Utilaft
Myślałem ze ten kod będzie dobry, bo w końcu był nagrywany przez profesjonalistów (chyba?)

No tak, nie do końca jeszcze widzę sens stosowania metod statycznych.

Chciałem na tym kodzie się uczyć, mieć taką podstawę.
nospor
Niby profesjonaliści a takie coś robią:
LogFile::AddLog("Zapytanie bazodanowe zwróciło pusty wynik!", __LINE__, __FILE__);

Super, fajnie, że mnie poinformowali, że zapytanie zwróciło pusty wynik.... tylko kurcze....jakie zapytanie? No i jeszcze ta linia i plik.... a na grzyba mi linia i plik, w którym wykonują LogFile::AddLog? Bardziej mnie by interesowała linia i plik, w którym była próba wykonania zapytania.
Pomijam już fakt, że brak wyników z zapytania nie jest żadnym błędem czy też informacją wartą logowania. To normalne, że zapytanie może nic nie zwrócić.
Adi32
Cytat
Uczę się z eduweb php oop.

Uczyłem się swego czasu z materiałów EduWeb i prawdę mówiąc mogę polecić jestnie CSS dla osób bardzo początkujących.
Fifi209
Cytat(Adi32 @ 13.03.2013, 08:27:56 ) *
ManagerDB to najczęściej singleton, wtedy przekazywanie przez konstruktor odpada.

A jaki problem z utworzeniem klasy statycznej np. Config, która z pliku wczyta do zmiennych konfiguracje DB ?
Poza tym, piszesz singleton - i znów strzał w stopę, bo nie wykonasz połączeń dla dwóch baz.

Cytat(Adi32 @ 13.03.2013, 08:27:56 ) *
Jednak lepiej byłoby przekazywać te stałe globalną typu $config['db_default']['host']...

Wypluj to i nie namawiaj do czegoś takiego.
!*!
Cytat(Utilaft @ 13.03.2013, 09:55:18 ) *
Myślałem ze ten kod będzie dobry, bo w końcu był nagrywany przez profesjonalistów (chyba?)

No tak, nie do końca jeszcze widzę sens stosowania metod statycznych.

Chciałem na tym kodzie się uczyć, mieć taką podstawę.


Profesjonaliści nie zrobiliby takiego syfu w kodzie. Im częściej widzę przykłady z ich kursów, tym bardziej mam wrażenie że piszą je początkujący. Zapoznaj się z podstawami np. PDO http://pl.wikibooks.org/wiki/PHP
Fifi209
!*! - wybacz ale powtarzasz to co już napisane, o PDO ja napisałem i dałem linka. O tym, że profesjonaliści tak nie robią pisał nospor smile.gif
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.