Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Polaczenie z mysql OOP
redelek
post 17.05.2010, 11:39:43
Post #1





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


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; ?

Ten post edytował redelek 17.05.2010, 11:42:30


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
lobopol
post 17.05.2010, 12:36:48
Post #2





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

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


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


Ten post edytował lobopol 17.05.2010, 12:40:18


--------------------
Go to the top of the page
+Quote Post
Crozin
post 17.05.2010, 18:22:37
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Tutaj masz poprawiony kod:
  1. <?php
  2.  
  3. $db = new PDO('mysql:dbname=baza;host=localhost', 'root', 'pass');
Proste nie?
Go to the top of the page
+Quote Post
redelek
post 21.05.2010, 14:34:42
Post #4





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


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

Ten post edytował redelek 21.05.2010, 14:35:26


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
wookieb
post 21.05.2010, 14:39:34
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 21.05.2010, 14:40:06


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.05.2010, 16:34:44
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Ja uparcie obiektowo
A to w odniesieniu do czego pisałeś? Bo Twój kod z obiektowym ma niewiele wspólnego.
Go to the top of the page
+Quote Post
redelek
post 21.05.2010, 19:50:52
Post #7





Grupa: Zarejestrowani
Postów: 658
Pomógł: 37
Dołączył: 4.06.2005
Skąd: Wawa

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


Śmiejcie się śmiejcie. Nie chodziło mi o chwalenie swoim kodem.
Dziękuję za pomoc i zachętę.

Ten post edytował redelek 21.05.2010, 19:51:12


--------------------
Pozdrawiam
Piotrek R
Go to the top of the page
+Quote Post
wookieb
post 21.05.2010, 20:22:24
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


Ten post edytował wookieb 21.05.2010, 20:24:25


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.05.2010, 20:38:09
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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
Go to the top of the page
+Quote Post
wookieb
post 21.05.2010, 21:04:34
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No dobra faktycznie tongue.gif
No ale wiadomo o co chodzi smile.gif


--------------------
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.06.2025 - 21:44