Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa obsługująca mysql
ZuyPan
post
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
zend
post
Post #2





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


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
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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 (IMG:style_emoticons/default/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...
Go to the top of the page
+Quote Post
ZuyPan
post
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


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.
Go to the top of the page
+Quote Post
jang
post
Post #5





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

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


  1. if ($this->connect2){
  2. echo 'Działa';
  3. }else{
  4. echo 'Błąd';
  5. }
Go to the top of the page
+Quote Post
piotr94
post
Post #6





Grupa: Zarejestrowani
Postów: 331
Pomógł: 30
Dołączył: 11.11.2008
Skąd: Kraków

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


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']);


Ten post edytował piotr94 21.07.2010, 11:44:35
Go to the top of the page
+Quote Post
ZuyPan
post
Post #7





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


Dziękuję ! (IMG:style_emoticons/default/smile.gif) Działa, pierwszy etap bardzo prostej, edukacyjnej klasy obsługującej mysql za mną (IMG:style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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).
Go to the top of the page
+Quote Post
ZuyPan
post
Post #9





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


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.
Go to the top of the page
+Quote Post
darko
post
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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.
Go to the top of the page
+Quote Post
ZuyPan
post
Post #11





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


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ć.
Go to the top of the page
+Quote Post
Crozin
post
Post #12





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

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


Jeżeli wykonanie zapytania się nie powiodło powinieneś wyrzucić wyjątek.
Go to the top of the page
+Quote Post
ZuyPan
post
Post #13





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


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 ?

Ten post edytował ZuyPan 21.07.2010, 12:56:13
Go to the top of the page
+Quote Post
darko
post
Post #14





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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!".
Go to the top of the page
+Quote Post
ZuyPan
post
Post #15





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 4.02.2010

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


(IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
darko
post
Post #16





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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

Ten post edytował darko 21.07.2010, 13:11:18
Go to the top of the page
+Quote Post
rvk
post
Post #17





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 21.06.2008
Skąd: Polska

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


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 ?

Go to the top of the page
+Quote Post
Crozin
post
Post #18





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

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


Co wyście się wszystcy uparli na "klasę obsługi mysql"? Podlinkowana klasa jest zła. MVC/MVP/innych warto używać.
Go to the top of the page
+Quote Post
rvk
post
Post #19





Grupa: Zarejestrowani
Postów: 41
Pomógł: 0
Dołączył: 21.06.2008
Skąd: Polska

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


dlaczego jest zła, jak budować klase aby była dobra ?
Go to the top of the page
+Quote Post
cojack
post
Post #20





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


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ą (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował cojack 24.07.2010, 20:00:40
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 06:39