Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Polaczenie z mysql OOP
Forum PHP.pl > Forum > Przedszkole
redelek
Witam,

Przerobiłem troszkę materiału i proszę o poradę. Zanim się napiszę i potem wszystko będzie źle smile.gif
Napisałem klasę do łączenia się z mysql i nawet działa. Pytanie mam takie czy jest to dobrze napisane ?
Czy na coś zwrócić uwagę i gdzieś mam jakieś błędy? które Wy widzicie ?

  1. ini_set('display_errors','1');
  2. class mMySQL
  3. {
  4.  
  5. public $Serwer, $Baza, $Uzytkownik, $Haslo;
  6. #-#############################################
  7. # Nawiazywanie polaczenia z baza
  8. function Polacz ($link=false) {
  9. $this->link_id=@mysql_connect($this->Serwer,$this->Uzytkownik,$this->Haslo,$link);
  10.  
  11. if (!$this->link_id) {
  12. $this->blad("Nie mogę podłączyć się do serwera: <b>$this->Serwer</b>.");
  13. }
  14.  
  15. if(!@mysql_select_db($this->Baza, $this->link_id)) {//no database
  16. $this->blad("Nie mogę wybrać bazy danych: <b>$this->Baza</b>.");
  17. }
  18. if(@mysql_select_db($this->Baza, $this->link_id)) {
  19. mysql_query("SET NAMES 'utf8'");
  20. mysql_query("SET CHARACTER_SET_CLIENT=utf8");
  21. mysql_query("SET CHARACTER_SET_RESULTS=utf8");
  22. }
  23. }#-#Polacz()
  24. #-#############################################
  25. # zamykanie polaczenia z baza
  26. function Zamknij() {
  27. if(!@mysql_close($this->link_id)){
  28. $this->blad("Nie można zamknąć połączenia z serwerem :(");
  29. }
  30. }#-#zamknij()
  31. #-#############################################
  32. # komunikaty o błędach
  33. function blad($msg='') {
  34. if($this->link_id>0){
  35. $this->error=mysql_error($this->link_id);
  36. $this->errno=mysql_errno($this->link_id);
  37. }
  38. else{
  39. $this->error=mysql_error();
  40. $this->errno=mysql_errno();
  41. }
  42. echo "<b>Błąd aplikacji</b><br />";
  43. echo "<hr>";
  44. echo "<b>Komunikat:</b>".$msg."<br />";
  45. echo "<b>MySQL błąd: </b>".$this->error."<br>";
  46. echo "<b>MySQL kod: </b>".$this->errno."<br>";
  47. echo "<br>";
  48. }#-#blad()
  49.  
  50. }
  51. ## JAK TO DZIAŁA
  52. $SQL = new mMySQL();
  53. $SQL->Serwer = 'localhost';
  54. $SQL->Baza = 'mysql';
  55. $SQL->Uzytkownik = 'root';
  56. $SQL->Haslo = '';
  57. $SQL->Polacz();
  58.  
  59.  
  60. $SQL->Zamknij();
  61. ?>


Czy na przykład użyć protected Polacz; ?
lobopol
No dla mnie to jest nieco dziwna klasa, czemu nie używasz konstruktorów/destruktorów i nie deklarujesz typów metod? Dodatkowo metody powinny zwracać jakieś wartości, a nie wyświetlać za pomocą echo czyli nie:

  1. function metoda(){
  2. echo "costam";
  3. }


a

  1. public function metoda(){
  2. return $this->wartosc;
  3. }


Dalej idą metody i zmienne do których nie powinno się mieć dostępu z zewnątrz (czyli login do bazy danych/hasło/itp.) powinny być ustawione na private albo protected (przy dziedziczeniu)


Sama klasa(prosta wersja) powinna wyglądać mniej więcej tak:
  1. class Database{
  2. private $dbHandler;
  3. public function __construct($dbLogin, $dbPassword, $dbHost, $dbName) {
  4. $this->dbHandler = @mysql_connect($dbHost,$dbLogin,$dbPassword) or $this->sql_error(mysql_error());
  5. mysql_select_db($dbName,$this->dbHandler);
  6. mysql_query('SET NAMES utf8');
  7. return true;
  8. }
  9.  
  10. public function query($query){
  11. //tu kasowanie/update/dodawanie do sql jeżeli błąd to $this->sql_error(mysql_error());
  12. return true;
  13. }
  14.  
  15. public function select($query){
  16. //tu funkcja do wyciągania selecta z bazy danych
  17. }
  18.  
  19. private function sql_error($error){
  20. //tu funkcje raportowania błędów sql np. zapis do pliku nie powinno się raczej wyświetlać użytkownikom dokładnego błędu
  21. die('Wystąpil problem z bazą danych.');
  22. }
  23. public function __destruct(){
  24. //tu niszczenie połączenia bazy
  25. }
  26.  
  27. }
  28. a użycie:
  29.  
  30. $db = new Database($dbLogin, $dbPassword, $dbHost, $dbName); //tworzenie obiektu
  31. $db->select($query); //zapytanie select do bazy
  32. unset($db); //niszczenie obiektu
Crozin
Tutaj masz poprawiony kod:
  1. <?php
  2.  
  3. $db = new PDO('mysql:dbname=baza;host=localhost', 'root', 'pass');
Proste nie?
redelek
Hej,

Ja uparcie obiektowo, poprawiłem to na co zwróciliście mi uwagę i wygląda to tak
Proszę zobaczcie i powiedźcie czy jest dobrze lub czego brakuje

  1. class mMySQL
  2. {
  3. private $polacz_db; //połączenie do serwera
  4. private $dbuzytkownik = "root1"; //uzytkownik nazy danych
  5. private $dbhaslo = ""; // jego hasło
  6. private $dbnazwa = "bz_txt"; //nazwa bazy
  7. private $dbserwer = "localhost"; //nazwa serwera
  8. private $dbwynik; // wynik zapytania
  9.  
  10. public function __construct() {
  11. $this->polacz_db = @mysql_connect($this->dbserwer,$this->dbuzytkownik,$this->dbhaslo);
  12. if(!($this->polacz_db)) {
  13. return false;
  14. }
  15. else {
  16. mysql_query("SET NAMES 'utf8'");
  17. mysql_query("SET CHARACTER_SET_CLIENT=utf8");
  18. mysql_query("SET CHARACTER_SET_RESULTS=utf8");
  19. mysql_select_db($this->dbnazwa);
  20.  
  21. return true;
  22. }
  23. }
  24.  
  25. public function __destruct() {
  26. @mysql_close($this->polacz_db);
  27. }
  28.  
  29. public function query($sql) {
  30. $this->dbwynik = mysql_query($sql);
  31. return $this->dbwynik;
  32. }
  33.  
  34. }


Będę wdzięczny za kolejne uwagi
wookieb
Wszystkiego.
Ziomuś co my mamy oceniać? Wpakowanie na siłę w obiekt mysql_query i mysql_connect? Co mamy ocenić?
Pomysł? brak
Jakość? brak
Czy jesteś pewien, że wykonanie dwóch dodatkowych zapytań po "set names" jest potrzebne czy wyczytałeś tak "w necie" ?
Ludzie nie chwalcie się takimi rzeczami bo nie ma czym, a jedynie robicie śmietnik!!!

Zresztą PDO oferuje wystarczająco dużo, żeby takie klasy jak ta nie powstawały.
Ciekawostka przy 10 000 wywołaniach pdo przegrywa z mysql o jedna sekunde. A jak mysql opakujesz w klase to nie zrobi roznicy.
Crozin
Cytat
Ja uparcie obiektowo
A to w odniesieniu do czego pisałeś? Bo Twój kod z obiektowym ma niewiele wspólnego.
redelek
Śmiejcie się śmiejcie. Nie chodziło mi o chwalenie swoim kodem.
Dziękuję za pomoc i zachętę.
wookieb
To może inaczej.
Sporo jest tutaj tematów, które pytają "czy moja linijka kodu jest ok", "czy dobrze pisze" które są bez sensu. Wiesz dlaczego?
1) Ile programistów tyle porad i rozwiązań, więc co z tego, że dostaniesz porady, ale razem z tym większy mętlik w głowie niż teraz.
2) Jesteś programistą a nie kopiowaczem. To, że ja Ci powiem, zrób tak i tak a ty pójdziesz i to zrobisz to leżysz, bo słuchasz wszystkie co Ci mówię, a powinieneś sam myśleć. Sam sprawdzać, testować, poszukiwać lepszych rozwiązań.

Jeżeli chcesz wiedzieć czy jest dobrze to proszę bardzo.
Zassaj symfony 2, ZendFrameworka i spójrz jak tam to wygląda to bez tematu będziesz znał odpowiedź na swoje pytanie.

I jeszcze jedno. Ustal swój jeden standard, przemyśl dokładnie co i jak i trzymaj się go zawsze.
Przykład: wszędzie będę stosował method chaining.
Crozin
Cytat
Przykład: wszędzie będę stosował method chaining.
Eee... no to to akurat powinno być zależne od tego, czy stosowanie tego ma sens czy nie, a nie od tego czy "zawsze będę stosować" czy nie. winksmiley.jpg
wookieb
No dobra faktycznie tongue.gif
No ale wiadomo o co chodzi 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.