Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa obsługująca mysql
Forum PHP.pl > Forum > PHP > Object-oriented programming
ZuyPan
Witam.
Koledzy z forum uświadomili mi, że to czas na naukę obiektówki. Jest to moja pierwsza "większa" klasa (te z tutoriali ograniczały się do sami wiecie czego biggrin.gif). Na wstępie też proszę aby nie było tematów w stylu PDO gdyż skoro mam się uczyć to lepiej na swoich skryptach. Problem pojawił się już na początku. Coś co w strukturalnym kodowaniu wygląda tak:

  1. <?php
  2. $polaczenie1 = mysql_connect($host, $login, $haslo);
  3. if ($polaczenie1){
  4. mysql_select_db($baza1, $polaczenie1);
  5. }
  6. ?>


nie chce mi wyjść w obiektówce. Chodzi mi konkretnie o "oznakowanie" połączenia mysql_connect by potem wywołać go przy mysql_select_db. Teoretycznie proste, ale co jeśli pojawi sie więcej połączeń? Wtedy każde musiało by mieć swoją zmienną na zasadzie: $polaczenie1, $polaczenie2 . Mam nadzieje, że rozumiecie o co mi lotto smile.gif

A tak przy okazji to mam pytanie, które mnie męczy a o dziwo w nie znalazłem na nie odpowiedzi:

  1. <?php
  2. class Mysql{
  3.  
  4. public function MysqlPolacz(){
  5.  
  6. }
  7.  
  8. }
  9. ?>


czy zmienne muszą być deklarowane przed wywołaniem funkcji czy mogą zostać utworzone dopiero "w niej". Chodzi mi o 3 zmienne - private $login; private $haslo; private $host; Innymi słowy - czy musi to wyglądać tak:
  1. <?php
  2. class Mysql{
  3.  
  4. private $login;
  5. private $haslo;
  6. private $host;
  7.  
  8. public function MysqlPolacz(){
  9.  
  10. }
  11.  
  12. }
  13. ?>

czy może tak:
  1. <?php
  2. class Mysql{
  3.  
  4. public function MysqlPolacz(){
  5.  
  6.  
  7. private $login;
  8. private $haslo;
  9. private $host;
  10.  
  11. }
  12.  
  13. }
  14. ?>
zend
Zmienne mogą być tworzone dynamicznie za pomocą __get() i __set(), ale narazie daj sobie z tym spokój.
  1.  
  2. class x{
  3.  
  4. protected $connection = null;
  5.  
  6. public function __construct($login , $haslo , $host , $baza)
  7. {
  8. $this -> connection = new mysqli($login , $haslo , $host);
  9. }
  10.  
  11. public fucntion getConnection()
  12. {
  13. return $this -> connection;
  14. }
  15.  
  16. }


Zamiast oznaczać, utwórz kilka instancji połączenia, każda do innej bazy, potem zapisz w rejestrze, zrób statyczny setter w klasie i tam ustawiaj domyślne połączenie
zegarek84
Cytat(ZuyPan @ 20.07.2010, 18:43:29 ) *
Na wstępie też proszę aby nie było tematów w stylu PDO gdyż skoro mam się uczyć to lepiej na swoich skryptach.

oki - to trochu inaczej ;D
Mysqli - MySQL Improved Extension
The MySQLi Extension Function Summary
wiem - piszesz to w ramach ćwiczeń - ale podałem linki od tak na wszelki wypadek winksmiley.jpg
Cytat(ZuyPan @ 20.07.2010, 18:43:29 ) *
Teoretycznie proste, ale co jeśli pojawi sie więcej połączeń? Wtedy każde musiało by mieć swoją zmienną na zasadzie: $polaczenie1, $polaczenie2 .
nowe połączenie to tworzysz nowy obiekt - jeden obiekt zajmuje się jednym połączeniem... by obiekty te były dostępne we wszystkich miejscach skryptu to możesz je odkładać np. w tablicy zmiennej statycznej (prawie jak global ale lepiej globali nie używać - po prostu odkładaj sobie w jakimś rejestrze) - lub obiekt do innych klas będziesz musiał przekazywać jakimiś metodami dostępowymi...
ZuyPan
Ech :/ Wczoraj do 1 w nocy czytałem o OOP i nie potrafię stworzyć nawet najprostszego skryptu :/

plik mysql.class.php (nawet nie wiem czy można w ten sposób nazywać pliki)

  1. <?php
  2.  
  3. class Mysql{
  4.  
  5. private $connect2;
  6.  
  7. public function connect($host, $login, $haslo, $baza){
  8.  
  9.  
  10. $this -> connect2 = mysql_connect($host, $login, $haslo);
  11. mysql_select_db($baza, $this->connect2);
  12.  
  13. if ($connect2){
  14. echo 'Działa';
  15. }else{
  16. echo 'Błąd';
  17. }
  18.  
  19. }
  20.  
  21. }
  22.  
  23. ?>


plik index.php

  1. <?php
  2.  
  3. include ('mysql.class.php');
  4.  
  5. $host = 'localhost';
  6. $login = 'root';
  7. $haslo = '';
  8. $baza = 'test';
  9.  
  10. $polaczenie = new Mysql;
  11.  
  12. $polaczenie -> connect($host, $login, $haslo, $baza);
  13.  
  14. ?>

Ciągle wyświetla mi błąd. Na localhoscie nie mam hasła do użytkownika root, więc go nie przypisuje zmiennej.
jang
  1. if ($this->connect2){
  2. echo 'Działa';
  3. }else{
  4. echo 'Błąd';
  5. }
piotr94
daj procedury łączenia jako __construct():
  1. class mysql{
  2. private $_connection;
  3. private $_query;
  4. public function __construct($server,$user,$password,$database){
  5. if(!$this->_connection=@mysql_connect($server,$user,$password)){
  6. trigger_error('Can\'t connect to database (host: <i>'.$server.'</i>, user: <i>'.$user.'</i>)',E_USER_ERROR);
  7. }elseif(!@mysql_select_db($database,$this->_connection)){
  8. trigger_error('Can\'t select database (database: <i>'.$database.'</i>)',E_USER_ERROR);
  9. }
  10. }
  11. //... dlasza część klasy, obsługa zapytań, i innych funkcji...
  12. }

np. tak wygląda początek mojej klasy do mysql, która pisałem... mniejsza z tym, dawno temu
i potem:
  1. $db=new mysql($config_script['mysql_host'],$config_script['mysql_user'],$config_script['mysql_pass'],$config_script['mysql_db']);
ZuyPan
Dziękuję ! smile.gif Działa, pierwszy etap bardzo prostej, edukacyjnej klasy obsługującej mysql za mną smile.gif
  1. <?php
  2. class Mysql{
  3.  
  4. private $sql;
  5.  
  6. function connect($host, $login, $haslo, $db){
  7.  
  8. $this -> sql = mysql_connect($host, $login, $haslo);
  9. mysql_select_db($db, $this->sql);
  10.  
  11. if ($this -> sql){
  12. echo 'Działa';
  13. }else{
  14. echo 'Błąd';
  15. }
  16.  
  17. }
  18.  
  19. }
  20.  
  21. ?>
darko
Do nauki oop nie bierz się za opakowywanie w klasę kodu strukturalnego, bo imo tak się nie nauczysz. Skoro nie chcesz rozbudowywać gotowych klas (np. pdo, mysqli) to zacznij naukę od abstraktów, np. zwierząt. Utwórz sobie klasę np. DziadekMis z jedną metodą publiczną, jedną chronioną i jedną prywatną. W każdej z tych metod zwracaj jakieś dane (do woli). Następnie napisz klasę TataMis dziedziczącą po DziadekMis i nadpisz spróbuj nadpisać wszystkie metody, zobacz, co się stanie. Kontynuując zabawę - spróbuj w klasie TataMis wywoływać metody Dziadka poprzez parent::metoda(). Ogólnie ucz się obiektówki na niekonkretnych abstraktach i traktuj każdy obiekt, jako najbardziej jak to tylko możliwe samodzielny i niezależny od innych byt. Imo programowanie obiektowe najlepiej poznaje się traktując obiekty jako zamknięte w logiczną całość funkcjonalne jednostki kodu. Za przykład może posłużyć dosłownie wszystko. Lubisz np. mechanikę? Utwórz obiekty: Kolo, Detka, Opona, Silnik, SkrzyniaBiegow, Rozrzad, Wtrysk itd. i spróbuj zbudować z nich samochód. Zachowanie samochodu (skręt w prawo, hamowanie, dodanie gazu, włączenie kierunkowskazu - zdefiniuj w metodach). Generalnie metody definiują zachowanie obiektu, właściwości - dane (w uproszczeniu). Ucz się od razu wykorzystywania interfejsów, właściwie - zaczynaj programowanie od zaprojektowania interfejsu i programuj zawsze pod wcześniej założony interfejs, nigdy odwrotnie (programowanie kontraktowe jest imo jednym z najwydajniejszych sposobów projektowych). To tylko takie moje krótkie uwagi, wynikłe z mojego doświadczenia w nauce oop. Naprawdę łatwiej jest nauczyć się programować pisząc nawet zupełne abstrakcje typu klasa Zwierzęta, (jakieś metody typu jedz(), spij() itp.) następnie klasa dziedzicząca po zwierzętach, np. Owady, nadpisująca wspomniane metody, dalej klasa np. Komar. Łatwiej Ci będzie zrozumieć relacje, jakie zachodzą pomiędzy obiektami, jeśli w naturalny sposób zaczniesz odwzorowywać obiektami istniejącą rzeczywistość (zresztą poniekąd o to chodzi w oop - rozbijanie dużego problemu na małe podproblemy).
ZuyPan
Darko z wielką chęcią, ale "czas to pieniądz". Niestety mam tego pecha, że obiektówkę muszę poznać bardzo szybko, i niestety nie mam czasu na zabawy w odkrywce tajemnic lasu. Jak tylko uporam się z dotychczasowymi problemami na pewno poznam dużo lepiej ten język, a teraz. No cóż, zrobić tak aby działało, innego wyjścia nie ma.
darko
Nauka złych nawyków, podejście do problemów na zasadzie szukania sposobu "byleby działało", przerabianie materiału "po łebkach" <-- imo to jest gorsze niż brak wiedzy w ogóle. No ale bywa i tak, że czasu nie ma na naukę, wtedy jest niestety miejsce na prowizorkę. Owocnej nauki.
ZuyPan
skorzystam z okazji i zapytam:
Sprawdzanie czy zapytanie wykonało się zostawić klasie czy w miejscu gdzie tworze obiekt sprawdzać? Cały problem polega na tym, że będzie jeszcze jedna klasa odpowiedzialna za języki która wczytuje wartości treści z pliku pl.php. I teraz nie wiem jak się za to zabrać.
Crozin
Jeżeli wykonanie zapytania się nie powiodło powinieneś wyrzucić wyjątek.
ZuyPan
Poczytałem o wyjątkach i znalazłem taki kod:
  1. <?php
  2. try // 1
  3. {
  4. $tekst = @file_get_contents('plik.txt');
  5.  
  6. if($tekst === false)
  7. {
  8. throw new Exception('Nie można otworzyć pliku plik.txt!'); // 2
  9. }
  10.  
  11. echo 'Nasz tekst: '.$tekst; // 3
  12. }
  13. catch(Exception $wyjatek) // 4
  14. {
  15. echo $wyjatek -> getMessage(); // 5
  16. }
  17. ?>

Mam pytanie - czy "echo $wyjatek -> getMessage();" powoduje zapisanie błędu z zmiennej $wyjatek do obiektu/klasy/metody (to chyba jest metoda prawda ? ;>) i można sobie wywołać w dowolnym miejscu strony nowy obiekt getMessage(); i to spowoduje wyświetlenie ewentualnego błędu ?
darko
Cytat(ZuyPan @ 21.07.2010, 13:55:58 ) *
Poczytałem o wyjątkach i znalazłem taki kod:
  1. <?php
  2. try // 1
  3. {
  4. $tekst = @file_get_contents('plik.txt');
  5.  
  6. if($tekst === false)
  7. {
  8. throw new Exception('Nie można otworzyć pliku plik.txt!'); // 2
  9. }
  10.  
  11. echo 'Nasz tekst: '.$tekst; // 3
  12. }
  13. catch(Exception $wyjatek) // 4
  14. {
  15. echo $wyjatek -> getMessage(); // 5
  16. }
  17. ?>

Mam pytanie - czy "echo $wyjatek -> getMessage();" powoduje zapisanie błędu z zmiennej $wyjatek do obiektu/klasy/metody (to chyba jest metoda prawda ? ;>) i można sobie wywołać w dowolnym miejscu strony nowy obiekt getMessage(); i to spowoduje wyświetlenie ewentualnego błędu ?

Właśnie m.in. dlatego proponowałem naukę podstaw podstaw oop; echo nie powoduje zapisania błędu do zmiennej, ale wyświetla dokładnie treść rzuconego wyjątku czyli "Nie można otworzyć pliku plik.txt!".
ZuyPan
wstydnis.gif ale gafa. Oczywiście wiem do czego służy echo, ale tak jakoś wyszło, że chyba z "zaczytania" pominąłem go patrząc na kod. Jakkolwiek to się stało, że go nie zauważyłem to czy da się w takim razie zapisać w zmiennej to co wywali wyjątek i za pomocą np. klasy Wyjatek odczytać go w pewnym miejscu strony?
darko
Da się, np.
  1. $msg = null;
  2. try {
  3. // cos tam
  4. throw new Exception('coś tam');
  5. } catch(Exception $e) {
  6. $msg = $e->getMessage();
  7. }
  8. // (...)
  9. // coś tam
  10. echo $msg;


Dobrym podejściem do tego zagadnienia jest tworzenie własnej hierarchii wyjątków rozszerzając standardową klasę Exception, poczytaj
rvk
muszę się podpiąć pod temat, (modzi)
również chciałbym się zabrać za naukę programowania obiektowego, i moim pierwszym zadaniem byłoby napisanie klasy obsługującą mysql, chciałbym napisać własnego cms, dzięki któremu nie musiałbym ciąglę powtarzać kody przy roieniu stron,
no to tak chciałem się spytać czy ta klasa co jest opisana tutaj jest dobrym przykładem czy mało użyteczna ( http://webinside.pl/artykul-182-klasa-do-obslugi-mysql.html ) i czy pisząc/chcąc pisać swojego CMS'a pisać go/starać się go pisać już oddzielając warstwy tzn używać wzorac MVC ?

Crozin
Co wyście się wszystcy uparli na "klasę obsługi mysql"? Podlinkowana klasa jest zła. MVC/MVP/innych warto używać.
rvk
dlaczego jest zła, jak budować klase aby była dobra ?
cojack
Cytat(Crozin @ 24.07.2010, 20:19:44 ) *
Co wyście się wszystcy uparli na "klasę obsługi mysql"? Podlinkowana klasa jest zła. MVC/MVP/innych warto używać.

Ty byś powybanował towarzycho nie? Co Ci szkodzi że piszą klasy które z oop mają tyle wspólnego co żyd z chińczykiem? Niech se piszą biggrin.gif Każdy od czegoś zaczynał. Piszcie piszcie, uczcie się na błędach, jak się pisze swój kod i on zaczyna działać to później się go przepisuje jeszcze z trylion razy bo się wpadło na lepszy pomysł. To rodzi nowe idee i rozwija kreatywność. Piszcie piszcie.


btw ja też tak zaczynałem teraz przepisuje swojego FW już 7 raz bo cały czas mi się w nim coś nie podoba biggrin.gif
rvk
oj chciałbym mieć już własnego framework, nawet prostego też cały czas bym go rozwijał,
ale no trzeba od czegoś zacząć, jeśli możesz jakie skrypty pisałeś jak zaczynałeś pisać obiektowo, bo z tym mam problem nie wiem od czego zacząć jak raz coś zaproponowałem to potem mowili ze to nie oop

sorry za moje zielone posty, ale zależy mi na rozwijaniu się w obiektówce, ale od jakiegoś czasu stoję w miejscu.
cojack
Nic się nie martw, pisz jak piszesz, jak będzie działać i postawisz na tym jedną stronę to później napiszesz od nowa, tu na forum jest chyba jakaś moja klasa do obsługi sessji biggrin.gif tam są dopiero jaja.
Crozin
Cytat
Co Ci szkodzi że piszą klasy które z oop mają tyle wspólnego co żyd z chińczykiem?
Bo przychodzą tutaj z zamiarem nauczenia się, więc jeżeli coś jest złe to się to wytyka.
Cytat
teraz przepisuje swojego FW już 7 raz bo cały czas mi się w nim coś nie podoba
No i wszystko rozchodzi się o to by właśnie takich błędów nie popełniali.
Cytat
oj chciałbym mieć już własnego framework, nawet prostego też cały czas bym go rozwijał,
Pisanie własnego FW w celu innym niż sam FW (ew. w celu edukacyjnym) w większości przypadków mija się z celem. Jedyny przypadek to taki, gdy istniejące już rozwiązania z góry się nie sprawdzą przy danym projekcie.
Cytat
tu na forum jest chyba jakaś moja klasa do obsługi sessji tam są dopiero jaja.
Eee... sesje to zapis/odczyt danych - jeżeli dla Ciebie to są jaja to chyba nie powinieneś się wypowiadać w tym wątku.

@rvk: PHP to nie najlepszy język do nauki OOP ale i w nim można (sam się na nim właśnie uczyłem). Chcesz jakiś pomysł na "co na początek"? Możesz sobie napisać np. skrypt forum.
cojack
Crozin jaja bo to były moje początki z oop.

Cytat
No i wszystko rozchodzi się o to by właśnie takich błędów nie popełniali.

Nie uczyli że jak się nie przewrócisz to się nie nauczysz?

Jeżeli każdy kod który napiszesz podoba Ci się to nie jesteś prawdziwym programistą. Jesteś zwykłym klepaczem kodu.
Crozin
1) Kod powinieneś pisać po przynajmniej chwilowym zastanowieniu. Refaktoryzacja kodu się zdarza, ale... 7 razy?
2) Z tym klepaczem kodu to mnie rozwaliłeś... mam cel i go osiągam w możliwie krótkim czasie - to jest programowanie. Nikogo nie obchodzi jak to zrobiłeś i czy Tobie samemu się to podoba. A onanizowanie na widok kodu to oznaka jakiegoś zboczenia.
ZuyPan
Ojc widzę, że mój topic staje się miejscem ostrej wymiany zdań biggrin.gif Ja swoją klasę obsługi mysql pisałem z 3 powodów:
1. Chęć nauki, ale nie na podstawie dziwnych przykładów z tutoriali (od zawsze lepiej trafiała do mnie "praktyczna teoria"). Dlatego też było to coś co może się w jakiś sposób przydać
2. Czas mnie gonił, a ja koniecznie potrzebowałem kilku klas. Nie było czasu na dziwne nauki. Efekt mnie nie rozczarował, mam już swoją małą biblioteczkę smile.gif
3. Mam takie dziwne "zboczenie" w myśl którego twierdzę, że co pisane przeze mnie jest moje (moje - znam to na wylot, przystosowane właśnie do mnie). Takie gotowe klasy choć pewnie 100 razy lepsze są mi jakoś obce, i jednak wolę to co moje, choćby przepisane na żywca, ale przynajmniej przepisując poznam to wszystko w 100 %
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-2024 Invision Power Services, Inc.