Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa połączenia z MySQL
Forum PHP.pl > Forum > PHP
Fluke
Witam.
Piszę pierwszy raz na tym forum wiec proszę o wyrozumiałość. Od nie dawna uczę się PHP a tym bardziej programowania obiektowego więc będę robił dużo błędów wiec proszę o poprawianie mnie.

Stworzyłem klasę CDB w której jest łączenie się z bazą danych. Wywoływana jest w konstruktorze. Następnie stworzyłem klasę w odzielnym pliku do obsługi błędów(Głównie wyświetlanie oraz zapis logów do pliku). W pliku engine.inc.php są zapisane hasła do łączenia się z bazą danych.



Tutaj klasa CDB.

  1. <?php
  2. include("class.errors.php");
  3.  
  4. class CDB extends CErrors {
  5.  
  6. public $_filename = null;
  7. public $_error = null;
  8. protected $_mysql_connect = null;
  9.  
  10. function __construct($filename) {
  11. $error = new CErrors();
  12. $this->_filename = $filename;
  13.  
  14. if(!empty($this->_filename)) {
  15. if(include($this->_filename)) {
  16. $this->_mysql_connect = mysql_connect($mysql_data[0], $mysql_data[1], $mysql_data[2]);
  17. if($this->_mysql_connect) {
  18. $mysql_select_db = mysql_select_db($mysql_data[3], $this->_mysql_connect);
  19. if($mysql_select_db){
  20. $this->_dbname = $mysql_data[3];
  21. $this->_error = $error->getErrors('DB', 0,false, true);
  22. } else { $this->_error = $error->getErrors('DB', 2,true, true); }
  23. } else { $this->_error = $error->getErrors('DB',1,true, true); }
  24. } else { $this->_error = $error->getErrors('FILE', 1, true, true); }
  25. }
  26. }
  27.  
  28. function __destruct() {
  29. mysql_close($this->_mysql_connect);
  30. }
  31. }
  32. ?>

Wywoływując tą klasę musimy podać ścieżkę gdzie znajduje się plik konfiguracyjny engine.inc.php.


Klasa CErrors:


  1. <?php
  2. class CErrors {
  3. protected $_logFileName = '../logs/logs.php';
  4.  
  5. protected function getErrors($name,$id,$show,$setLogToFile) {
  6. $name = (string)$name;
  7. $id = (int)$id;
  8.  
  9. $errors = array(
  10. 'DB' => array(
  11. 0 => 'Połączono z serwerem MySQL',
  12. 1 => 'Nie można połączyć się z serwerem MySQL',
  13. 2 => 'Nie można wybrać preferowanej bazy danych w MySQL'
  14. ),
  15. 'FILE' => array(
  16. 1 => 'Nie można wybrać pliku zawietającego hasła dostepu do bazy danych w MySQL'
  17. )
  18. );
  19. if($setLogToFile) { CErrors::setLogToFile($errors[$name][$id]); }
  20. if($show) { return $errors[$name][$id]; }
  21.  
  22. }
  23.  
  24. protected function setLogToFile($error) {
  25. $date = date("Y-m-d H:i:s");
  26. if(file_exists($this->_logFileName)) {
  27. $handle = fopen($this->_logFileName, "a");
  28. $saveError = $date.' Error: "'.$error.'"'."<br /> \n";
  29. } else {
  30. $handle = fopen($this->_logFileName, "w");
  31. chmod($this->_logFileName,0600);
  32. $saveError = $date.' Error: "'.$error.'"'." <br /> \n";
  33. }
  34. if($handle) { $fwrite = fwrite($handle,$saveError); }
  35. }
  36. }
  37.  
  38. ?>


Plik engine.inc.php

  1. <?php
  2. $mysql_data = array("localhost", "root", "root", "corner1");
  3. ?>


Plik index.php
  1. <?php
  2. $db = new CDB("../goo/engine.inc.php");
  3. echo $db->_error;
  4. ?>


Pytanie takie:
  1. Czy opłaca się tak kombinować, czy się zakombinowałem, czy w ogóle jest to dobre?
  2. Czy, jeśli chodzi o kod, jest w miarę przejrzysty?
  3. Czy dobrze są stworzone klasy. Do tych klas bym dopisał następne metody ale chcę wiedzieć czy w ogóle dobrze myślę.



Dziękuję za jakiekolwiek opinie i rady.
Pozdrawiam.
magiczny_piesek
Pisz, pisz, nabierzesz praktyki, będziesz więcej rozumiał i sam widział czy jest dobrze.

Jeśli chcesz uniknać tak głębokich wcięć rób warunki na 'nie' czyli np: if (nieUdaloSie) return; , a nie jak masz obecnie:

if (ok) {
//
if ...
//
}

Duzo lepiej czyta się kod jeśli jest 'smukły'.


Oczywiście masz kilka błędów, które sam napewno wyłapiesz, np skąd sie bierze $mysql_data?

Ucz się najpierw projektwać. Odejdź od komputera i na kartce ołówkiem zaprojektuj klasy, metody i zalezności. Prześledź możliwe przypadki - czy moje rozwiązanie poprawnie działa dla każdego.
Dopiero teraz przechodź do implementacji.
Zyx
Taka rada praktyczna właśnie ad. projektowania, a właściwie to trzy rady:

1. Pojedyncza klasa powinna być odpowiedzialna tylko za jedną rzecz - fachowo nazywa się to zasadą jednej odpowiedzialności. Innymi słowy, nie twórz szwajcarskich scyzoryków, które jednocześnie piorą, frezują, gotują obiad i jeszcze obsługują błędy, bo to ma niewiele wspólnego z projektowaniem obiektowym.

2. Do obsługi błędów masz coś takiego, jak mechanizm wyjątków... smile.gif

3. Nazewnictwo klas w stylu CDupa jest kompletnie bez sensu i do d... gdyż z biegiem czasu będziesz miał coraz większe trudności z ich integracją. W projektach PHP już od jakiegoś czasu wdrażany jest zunifikowany standard nazewnictwa klas i naprawdę polecam się z nim zapoznać, gdyż niesamowicie ułatwi Ci on życie. Wprowadzenie do niego masz tutaj: http://pl.wikibooks.org/wiki/PHP/Automatyc...azewnictwa_klas
Fluke
Dziękuję za odpowiedzi:
Ale chodziło mi o myślenie, czy opłaca się robić połączenie do mysql w konstruktorze? Czy taka klasa z obsługą błędów nadaje się(bo ona dodatkowo zapisuje logi do pliku, mogła by również coś jeszcze robić jeśli chodzi o błędy).

Bo zwykłe łączenie do bazy to wystarczy kilka linijek kodu i śmiga.

magiczny_piesek
To $mysql_data to tablica która się znajduje w pliku engine.inc.php i w niej zawarte są dane do połączenia się z bazą.

Czy macie jakieś inne pomysły do zabezpieczenia danych, które znajdują się w pliku .php tak jak tutaj jest, zwykły użytkownik tego nie odczyta ale może są jakieś sposoby które hakerzy znają?

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.