Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> czy pisać to obiektowo?
marekc12
post 1.08.2008, 14:51:55
Post #1





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


Witam!

Uczę się PHP i postanowiłem napisać CMSa.. Już mam dodawanie/edytowanie podstron, menu. Mój CMS wszystko sobie zapisuje w bazie MySql.
Wyczytałem, że lepszym sposobem programowanie jest programowanie obiektowe.

Tylko właśnie nie do końca wiem czy lepiej pisać to obiektowo czy nie... i to jest moje pytanie smile.gif

Np. w PANELU ADMINA w dziale PODSTRONY mam to zrobione tak:

*zapytanie:
  1. SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`, `autor` FROM `podstrony` ORDER BY `id`

*za pomocą:
  1. <?php
  2. while ($wiersz = mysql_fetch_row($idzapytania))
  3. ?>
wyświetlam wszystko w tabeli, USER może sobie zaznaczyć kilka PODSTRON i kliknąć USUŃ.
DOKUMENT SIE PRZELADOWUJE I MAM W ZMIENNYCH POST/GET NUMERY ID PODSTRON DO USUNIECIA
*zapytanie:
  1. DELETE FROM `podstrony` WHERE `id`='.$delete
usuwa podstronę

A jeżeli dobrze zrozumiałem to obiektowo musiałoby to wyglądać jakoś tak:


tworze sobie klasę, w niej zmienne private $id,$status,$nazwa,$data_utworzenia,$data_edycji,$autor. Jako obiekty ładuje do klasy wszystko z MySql - każda podstrona to jeden obiekt. hmm tworze sobie funkcję w klasie która mi będzie wyświetlać tak jak wczesniej po kolei dane... USER zaznacza kilka do usuniecia i teraz zeby usunac dane funkcją np. UsunDane() (ktorą sobie stworze w klasie) to musze najpierw wczytac dane obiekty i potem wywolac fukncje UsunDane().. A normalnie po prostu usuwam obiekty o danym ID bez wczytywania ich.

wiec wychodzi dłużej ;/ Czyli obiektowo czy nie? Moze ja nie rozumiem obiektowoście po prostu jeszcze, moze to sie roi inaczej??

Ten post edytował marekc12 1.08.2008, 14:56:24
Go to the top of the page
+Quote Post
mike
post 1.08.2008, 14:55:03
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(marekc12 @ 1.08.2008, 15:51:55 ) *
Moze ja nie rozumiem obiektowoście po prostu jeszcze??
Nie rozumiesz tongue.gif
Poszukaj watków na ten temat, było ich już kilka i nie najmniejszego sensu wałkować tego raz jeszcze.
Go to the top of the page
+Quote Post
marekc12
post 1.08.2008, 20:50:56
Post #3





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


dobra, trochę poczytałem i na początek napisałem klasę do obsługi bazy danych:
  1. <?php
  2. class BazaSql
  3. {
  4. const SQLSERWER = 'localhost';
  5. const SQLUSER = 'user';
  6. const SQLPASS = 'kl234';
  7. const SQLNAME = 'baza';
  8. protected $sql_conn;
  9.  
  10. public static function polacz()
  11. {
  12. $self->sql_conn = mysql_connect(self::SQLSERWER, self::SQLUSER, self::SQLPASS);
  13. mysql_select_db(self::SQLNAME);
  14. }
  15.  
  16. public static function rozlacz()
  17. {
  18. mysql_close($self->sql_conn);
  19. }
  20. }
  21.  
  22. class Zapytanie extends BazaSql 
  23. {
  24. public static function wyslij_zapytanie($tekst_zapytania)
  25. {
  26. $self->idzapytania = mysql_query($tekst_zapytania);
  27. }
  28.  
  29. static public $idzapytania;
  30. }
  31. ?>


W ten sposob przynajmniej teoretycznie zyskałem na bezpieczeństwie, gdyż np. hasło do bazy jest dostępne tylko z wewnątrz klasy BazaSql smile.gif
to są moje naprawdę początki (uczę się od przed wczoraj programowania obiektowego ;D) i napiszie mi co myślicie o tym kodzie?
coś mi się wydaje ze się okaze to jest całkiem nie tak haha.gif

Ten post edytował marekc12 1.08.2008, 20:51:51
Go to the top of the page
+Quote Post
.radex
post 1.08.2008, 20:59:11
Post #4





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


no nie do końca takie bezpieczniejsze, ponieważ można to uzyskać poprzez

echo BazaSql::SQLPASS;

Niepotrzebnie rozdzielasz zapytanie od bazasql. Oprócz tego jest ok.


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
marekc12
post 1.08.2008, 21:01:59
Post #5





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


czyli lepiej chyba nie robić tego jako stałe ale zmienne private, wtedy będzie bezpiecznie.
Rozdzielając to myślałem właśnie o bezpieczeństwie, żeby funkcja "Zapytanie" nie miała dostępu do hasła do bazy. W razie np SqlInjection (przed którym oczywiscie mozna sie zabezpieczać) było by jeszcze bardziej bezpiecznie. Chociaż w razie takiego ataku i tak chyba haker może zrobić wszystko .. więc może i to nie ma sensu.. smile.gif

Ten post edytował marekc12 1.08.2008, 21:05:41
Go to the top of the page
+Quote Post
Shili
post 1.08.2008, 21:55:50
Post #6





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Cytat
Rozdzielając to myślałem właśnie o bezpieczeństwie, żeby funkcja "Zapytanie" nie miała dostępu do hasła do bazy. W razie np SqlInjection (przed którym oczywiscie mozna sie zabezpieczać) było by jeszcze bardziej bezpiecznie.
W ataku sql injection hasło jest co najmniej zbędne. "Haker" już jest połączony z bazą, więc w przypadku luki i tak zrobi co chce.

Jeśli zrobisz zmienne private, to klasa Zapytanie już ich nie odziedziczy. Ze swojej strony również proponuję zrobić z niej metodę do klasy BazaSql

Ten post edytował Shili 1.08.2008, 21:56:33
Go to the top of the page
+Quote Post
marekc12
post 1.08.2008, 22:03:09
Post #7





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


Cytat(Shili @ 1.08.2008, 22:55:50 ) *
Jeśli zrobisz zmienne private, to klasa Zapytanie już ich nie odziedziczy.


o to właśnie chodziło mi, ale teraz już wiem, że to nie ma sensu smile.gif Połącze bazesql z zapytaniem. Poza tym i tak użyję unset($self->sqlpassword); winksmiley.jpg

Ten post edytował marekc12 1.08.2008, 22:04:44
Go to the top of the page
+Quote Post
dadexix
post 1.08.2008, 22:26:00
Post #8





Grupa: Zarejestrowani
Postów: 439
Pomógł: 21
Dołączył: 28.06.2007
Skąd: Bielsko-Biała

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


a nie lepiej poprostu skożystać z jakiejś gotowej klasy/klas do obsługi DB? "u nas w necie tego pełno"


--------------------
"Na przykład zmiennej $jestem_najlepszy przypisujemy wartość logiczną TRUE"
Ja: użyj funkcji[...]
Grins: mów normalnie do mnie a nie po polsku
Ja: normalnie to znaczy jak?
Grins: No w PHP... inaczej mój parser ledwo kuma:)
Go to the top of the page
+Quote Post
marekc12
post 2.08.2008, 00:04:55
Post #9





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


Czy uważacie, że opłaca się pisać obiektowo jeżeli to nic nie da oprócz ładniejszego kodu?
No bo ja np. nie widzę innych pozytywnych stron jeżeli chodzi o moją klasę do bazy danych oprócz tego, że funkcje do baz są ładnie zgrupowane w klasę. Tak samo chyba będzie z obsługą podstron w moim CMSie, bo nie wiem czy coś mi da że podstrony będą obiektem smile.gif

Wg was lepiej pisać obiektowo, choćby dla ładniejszego kodu?

Niby jeżeli chodzi o ilość kodu to w sumie na to samo chyba wyjdzie.... no mi się wydaje, że lepiej jednak obiektowo.

EDIT:
przeglądam posta: Temat: PHPOOP Czy to tak moze byc
i tam jest taki kod:
  1. <?php
  2. public function edytuj_podstrone($id, $menu, $tresc) {
  3.  
  4. mysql_query("UPDATE `oop_cms`.`podstrony` SET `menu` = '$menu', `tresc` = '$tresc' WHERE `id` = $id LIMIT 1");
  5.  
  6. }
  7. ?>


Założyłem że to tak ma wyglądać, ale hmmm zaraz się pewnie okaże, że to tak się nie robi, czy tak?? No bo tak to ta obiektowość nic nie daje w tym przypadku bo to samo można napisać za pomocą zwykłej funkcji.

Ten post edytował marekc12 2.08.2008, 00:22:13
Go to the top of the page
+Quote Post
Sedziwoj
post 2.08.2008, 00:35:12
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Na początku tak się wydaje, że tylko ładniej, jak zaczniesz pojmować o co w tym chodzi, to zaczniesz rozumieć jaka jest w tym siła. Programowanie obiektowe, to nie jest jedna klasa, czy dwie, to wiele współpracujących ze sobą obiektów, ale aby to zrobić użytecznie, ładnie i elastycznie trzeba dużo czasu.
Moim zdaniem powinieneś zainwestować w książkę (choć nie powinno się brać tego co autor pisze jak prawdę, bo czasem mają głupie poglądy), poczytać kod jakiś prostych rzeczy napisanych obiektowo, czy chociażby je wykorzystać. Wtedy zrozumiesz jak to działa, bo samemu dochodząc bez przykładów, to zajmie wieki...
Spróbuj zintegrować swój projekt z Propel, poużywać go, na pewno wiele się dzięki temu nauczysz.

@marekc12

Uważaj na to co znajdziesz w internecie, bo czasem niby mądre osoby, a głupoty piszą.
Powinieneś zacząć od tego co ma ten obiekt robić, jaki ma zakres obowiązków, a potem dopiero wyszczególniać metody i właściwości.

Czyli np. ma łączyć się z bazą i umożliwiać wykonywanie kwerend na niej.

Co jest z interfejsu, wykonywanie kwerend, teraz pytanie jak to komplikować:
- można podzielić na dwa rodzaje, te co zwracają coś (SELECT) i te co nie zwracają (UPDATE/INSERT itp) więc można je rozdzielić, i wtedy np. jedna metoda zwraca tablice rekordów, a druga nic...
czy jakkolwiek, ale wszystkie mysql_*() powinny być w jednej klasie, a inne korzystać tylko z jej interfejsu.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
marekc12
post 2.08.2008, 01:03:12
Post #11





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


  1. <?php
  2. class Podstrony
  3. {
  4. private $podstrony;
  5.  
  6. public function listaPodstron()
  7. {
  8. $this->podstrony = BazaSql::wyslijZapytanie('SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`,
  9. `autor`, `tekst` FROM `podstrony` ORDER BY `id`');
  10. return($this->podstrony);
  11. }
  12.  
  13. public function dodajPodstrone()
  14. {
  15. BazaSql::wyslijZapytanie('INSERT INTO `podstrony` (`id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`, `autor`, `tekst`)
  16. VALUES ("", 0 ,"Nowa", datetime(), datetime(), "admin", "Dział w budowie...")');
  17. }
  18. }
  19.  
  20. $obiekt = new Podstrony();
  21.  
  22. $idzapytania=$obiekt->listaPodstron();
  23.  
  24. while ($wiersz = mysql_fetch_row($idzapytania))
  25. {
  26. //wyswietlanie wynikow
  27. }
  28. ?>


Czy taki kod jest ok? Oczywiscie jest to tylko zarys;) Ale czy to co jest jest ok?

no i martwi mnie to ze jest tylko 1 obiekt... dlatego nie wiem czy to tak ma być

Ten post edytował marekc12 2.08.2008, 01:06:35
Go to the top of the page
+Quote Post
.radex
post 2.08.2008, 09:59:10
Post #12





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Kod
private $podstrony;

    public function listaPodstron()
    {
        $this->podstrony = BazaSql::wyslijZapytanie('SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`,
                `autor`, `tekst` FROM `podstrony` ORDER BY `id`');
        return($this->podstrony);
    }


Bez sensu. Nie można po prostu

Kod
    public function listaPodstron()
    {
        $podstrony = BazaSql::wyslijZapytanie('SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`,
                `autor`, `tekst` FROM `podstrony` ORDER BY `id`');
        return $podstrony;
    }


?


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
marekc12
post 2.08.2008, 10:13:22
Post #13





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


hmmm ale to w ogólnie nie wykorzystuje obiektowości.... myślałem, że to się robi jakoś inaczej, ;p
No to w sumie tak jak po staremu smile.gif

Ten post edytował marekc12 2.08.2008, 10:13:49
Go to the top of the page
+Quote Post
Sedziwoj
post 2.08.2008, 10:25:00
Post #14





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@marekc12
Widzisz użyte mysql_fetch_row(), a tego nie powinno być poza obiektem. Wydaje mi się, że powinieneś mieć dwie metody, jedna do "INSERT, UPDATE, REPLACE, DELETE" druga do "SELECT, SHOW", dlaczego rozdzielić? Bo inaczej się je obsługuje, w pierwszej możesz zwracać mysql_affected_rows() czy mysql_insert_id(), a w drugiej właśnie wykonać w pętli mysql_fetch_assoc() i zwrócić już tylko tablicę. Rób tak aby zamknąć wszystkie funkcje mysql_*() w tej klasie, abyś w czasie korzystania z niej, nie miał potrzeby ich używania, a jak to zrobić, staraj się jak najwygodniej dla siebie. Chwilę poużywasz, a zapewne wpadniesz na pomysł jak to zrobić lepiej.

Cytat(marekc12 @ 2.08.2008, 11:13:22 ) *
hmmm ale to w ogólnie nie wykorzystuje obiektowości.... myślałem, że to się robi jakoś inaczej, ;p
No to w sumie tak jak po staremu smile.gif


Spokojnie, napiszesz jeden obiekt, potem będziesz mógł dalej rozszerzać. Pamiętaj aby utrzymać tę klasę jak najprostszą, potem możesz napisać co korzysta z niej i rozszerza jej możliwości.
Np. zrobić metodę update() której przekazujesz id,nazwę tabeli i array( 'pole' => 'wartość' ) a ona sama tworzy SQL i robi update.
Na początku zaczyna się od banalnie prostych rzeczy, potem się wchodzi w trudniejsze, tu ważne jest zrozumienie. Dlatego proponowałem, abyś skorzystał z Propel, bo najpierw byś poużywał, zobaczył jak to działa, a potem mógł zerknąć w kod i zobaczyć jak to zrobili.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
marekc12
post 2.08.2008, 10:35:47
Post #15





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


Cytat(Sedziwoj @ 2.08.2008, 11:25:00 ) *
Spokojnie, napiszesz jeden obiekt, potem będziesz mógł dalej rozszerzać. Pamiętaj aby utrzymać tę klasę jak najprostszą, potem możesz napisać co korzysta z niej i rozszerza jej możliwości.
Np. zrobić metodę update() której przekazujesz id,nazwę tabeli i array( 'pole' => 'wartość' ) a ona sama tworzy SQL i robi update.
Na początku zaczyna się od banalnie prostych rzeczy, potem się wchodzi w trudniejsze, tu ważne jest zrozumienie.


chyba zaczynam czaić o co biega snitch.gif

Ten post edytował marekc12 2.08.2008, 10:37:00
Go to the top of the page
+Quote Post
Cysiaczek
post 2.08.2008, 10:36:25
Post #16





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Zgadzam się, Propel to najlepszy start dla kogoś, kto chce zobaczyć, jak wygląda obiektowa obsługa baz danych. Nie jest może doskonały, ale jak ktoś go "załapie", to potem samo pójdzie smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
marekc12
post 2.08.2008, 10:49:00
Post #17





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


No to zainteresuję się Propelem smile.gif

hmmm czyli np. mogę to zrobić tak:
klasa Babcia (metody: PołączenieZBazą, RozłączenieZBazą, WysyłanieZapytaniaPodanegoWParametrze)
klasa Mama (metody: ZapisDoBazy[za pomocą funckcji w "babci": WysyłanieZapytaniaPodanegoWParametrze], OdczytZBazy[tak samo])
klasa Córka_Podstrony (metody: NowaPodstrona[z pomocą ZapisDoBazy w matce], UsunaPodstrone[z pomocą ZapisDoBazy w matce], ListaPodstron[z pomoca funkcji OdczytZBazy])
klasa Córka_Menu (metody: NowePodmenu[z pomocą ZapisDoBazy w matce], UsunMenu[z pomocą ZapisDoBazy w matce], ListaMenu[z pomoca funkcji OdczytZBazy])

oczywiście dziedziczenie: Babcia -> Mama -> Córki ;Dhehe


nie za bardzo zagmatwane? dobrze to wykombinowałem ?

Ten post edytował marekc12 2.08.2008, 10:56:31
Go to the top of the page
+Quote Post
.radex
post 2.08.2008, 12:39:43
Post #18





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Cytat(marekc12 @ 2.08.2008, 11:49:00 ) *
No to zainteresuję się Propelem smile.gif

hmmm czyli np. mogę to zrobić tak:
klasa Babcia (metody: PołączenieZBazą, RozłączenieZBazą, WysyłanieZapytaniaPodanegoWParametrze)
klasa Mama (metody: ZapisDoBazy[za pomocą funckcji w "babci": WysyłanieZapytaniaPodanegoWParametrze], OdczytZBazy[tak samo])
klasa Córka_Podstrony (metody: NowaPodstrona[z pomocą ZapisDoBazy w matce], UsunaPodstrone[z pomocą ZapisDoBazy w matce], ListaPodstron[z pomoca funkcji OdczytZBazy])
klasa Córka_Menu (metody: NowePodmenu[z pomocą ZapisDoBazy w matce], UsunMenu[z pomocą ZapisDoBazy w matce], ListaMenu[z pomoca funkcji OdczytZBazy])

oczywiście dziedziczenie: Babcia -> Mama -> Córki ;Dhehe
nie za bardzo zagmatwane? dobrze to wykombinowałem ?


IMO trochę za bardzo zagmatwane. Zainteresuj się wzorcem projektowym MVC winksmiley.jpg


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
Sedziwoj
post 2.08.2008, 12:41:59
Post #19





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


marekc12 ja Ci na prawdę dobrze radzę, teraz co powinieneś zrobić, to przerwanie wymyślania, wzięcie Propela i użycie go w paru miejscach, jak to zrobisz, wtedy wróć do wymyślania swoich pomysłów.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
marekc12
post 3.08.2008, 13:30:59
Post #20





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 1.08.2008

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


Cytat(radex_p @ 2.08.2008, 13:39:43 ) *
IMO trochę za bardzo zagmatwane. Zainteresuj się wzorcem projektowym MVC winksmiley.jpg

to MVC jest trochę porypane.. tzn nie do końca czaje o co biega ;d chyba chodzi o to jak będzie zbudowany mój cms.



Ja to chciałem zrobić w ten sposób(i normalnie i w panelu Admina tak samo):


w index.php includuje 2 pliki: skrypty.php i widok.php. Czyli najpierw wykonuje skrypty a pozniej wyswietlam.

np. w skrypty.php laczę sie z bazą, wczytuja sie podstrony do zmiennej, nie ma zadnego echo, nic nie jest wyswietlane.

A w widok.php jest całe body,meta,head i tylko elementy php: echo,if,for które wyswietlaja dane ze zmiennych(np .wczytane podstrony) ze skrpyty.php.




Czy tak jak ja to robie będzie nie poprawnie??

Skąd mozna sciagnać tego Propela??

Ten post edytował marekc12 3.08.2008, 13:34:02
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 27.04.2024 - 01:50