Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czy taki manager baz jest dobry?
Utilaft
post 12.03.2013, 19:17:09
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
Fifi209
post 13.03.2013, 00:20:05
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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

Ten post edytował Fifi209 13.03.2013, 00:22:02


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Adi32
post 13.03.2013, 08:27:56
Post #3





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


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']...

Ten post edytował Adi32 13.03.2013, 08:28:24


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post
Utilaft
post 13.03.2013, 09:55:18
Post #4





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (10%)
X----


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ę.
Go to the top of the page
+Quote Post
nospor
post 13.03.2013, 10:54:37
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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ć.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Adi32
post 13.03.2013, 11:07:53
Post #6





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


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.


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post
Fifi209
post 13.03.2013, 12:48:01
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
!*!
post 13.03.2013, 13:07:45
Post #8





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


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


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Fifi209
post 13.03.2013, 13:16:13
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


!*! - 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


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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: 14.08.2025 - 09:10