Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP4 Obiektowo
Forum PHP.pl > Forum > PHP
Fallout
Napisałem takie coś (nieskończone of courz) co ma w założeniu być systemem oceny artykułów, mam na to w miarę sporo czasu ( na zaliczenie) więc probuje to pisać "obiektowo" w php4.. sam nie wiem czy to wogóle można nazwać obiektowym.. chętnie poznam wasze opinie i wskazówki co jest nie tak... (kod działa btw.)

plik artykuly_class.inc.php

  1. <?php
  2. /*
  3.  
  4. @Projekt:  System Ocen Artykułów
  5. @Plik: artykuly_class.inc.php
  6. @Opis: Obłsuga i zarządzanie artykułami
  7. @Data:  12 maj 2005
  8. @Autor:  Marcin Bancerz
  9. @Inne: Praca zaliczeniowa z przedmiotu P.S.I.
  10.  
  11. */
  12. // klasa
  13. class artykuly
  14. {
  15.  
  16. var $artykul;  // zmienna do tablicy danych atrykulu
  17.  
  18. // konstruktor klasy (PHP4)
  19. function artykuly()
  20. {
  21. $this->artykul['aid'] = 0; // id artykulu
  22. $this->artykul['uid'] = 0; // id uzytkownika
  23. $this->artykul['a_tytul'] = ''; // tytul artykulu
  24. $this->artykul['a_tresc'] = ''; // tresc artykulu
  25. $this->artykul['a_data'] = ''; // data i czas dodania artykulu
  26. $this->artykul['a_ocena'] = 0; // laczna srednia ocen arykulu
  27. }
  28.  
  29. // funkcja ustawia wartosc dla zmiennej
  30. function SetValue($zmienna,$wartosc)
  31. {
  32. $this->artykul[$zmienna] = $wartosc;
  33. }
  34.  
  35. // funkcja pobiera wartosc dla zmiennej
  36. function GetValue($zmienna)
  37. {
  38. return $this->artykul[$zmienna];
  39. }
  40.  
  41. // funkcja ustawia wartosci dla calego artykulu
  42. function SetArticle($aid = '',$uid,$a_tytul,$a_tresc,$a_data,$a_ocena)
  43. {
  44. $this->SetValue('aid',$aid);
  45. $this->SetValue('uid',$uid);
  46. $this->SetValue('a_tytul',$a_tytul);
  47. $this->SetValue('a_tresc',$a_tresc);
  48. $this->SetValue('a_data',$a_data);
  49. $this->SetValue('a_ocena',$a_ocena);
  50. }
  51.  
  52. // funkcja laczy sie z baza danych, pobiera wskazany artykul i ustawia zmienne
  53. function GetArticle($aid)
  54. {
  55. // polaczenie z baza
  56. $db = new db();
  57.  
  58. // pobiera zawartosc danego artykulu
  59. $db->DoSql(&#092;"SELECT * FROM artykuly WHERE a_id=$aid\");
  60. $res = $db->Result();
  61.  
  62. // pobiera sume ocen komentarzy
  63. $db->DoSql(&#092;"SELECT SUM(a_ocena) FROM komentarze WHERE a_id='$aid'\");
  64. $res2 = $db->Result();
  65.  
  66. // pobiera ilosc komentarzy odnoszacych sie do artykulu
  67. $db->DoSql(&#092;"SELECT k_id FROM komentarze WHERE a_id='$aid'\");
  68. $res3 = $db->Result();
  69.  
  70. // wyliczanie sredniej
  71. $suma = $res2[0];
  72. $ilosc = $res3[0];
  73. if ((!$suma==0)or(!$ilosc==0)) $ocena = $suma/$ilosc; else $ocena = 0;
  74.  
  75.  // ustawienie wartosci zmiennych
  76.  $this->SetArticle($res[0],$res[1],$res[2],$res[3],$res[4],$ocena);
  77.  
  78. // usuniecie polaczenia z baza
  79. unset($db);
  80. }
  81.  
  82. function ArtykulIstnieje($aid)
  83. {
  84. // sprawdza czy identyfikator artykulu zostal przydzielony
  85. if (!$aid=='')
  86. {
  87. $db = new db();
  88. $db->DoSql(&#092;"SELECT a_id FROM artykuly WHERE a_id='$aid'\");
  89. if ($db->DBError) echo &#092;"Nieudana pobranie ilości rekordów! Linia: \".__LINE__.\" w pliku \".__FILE__.\"<br>\";
  90. return ($db->NumOfRows()>0);
  91. }
  92. // jesli nie, zwraca falsz
  93. else return False;
  94. }
  95.  
  96. // zapisuje biezace dane artykulu do bazy
  97. function SaveArticle()
  98. {
  99. $db = new db();
  100. if ($this->ArtykulIstnieje($this->GetValue('aid'))==TRUE)
  101. {
  102.  // jesli artykul nie istnieje zapisuje nowy
  103. $db->DoSql(&#092;"INSERT INTO artykuly VALUES('','$this->artykul['uid']')\");
  104. if ($db->DBError) echo &#092;"Nieudane dodanie rekordu! Linia: \".__LINE__.\" w pliku \".__FILE__.\"<br>\";
  105. $this->SetValue('aid',$db->AddedID());
  106. $this->GetArticle($this->GetValue('aid'));
  107. }
  108. else
  109. {
  110. // jesli istnieje aktualizuje go
  111. $n_uid = $this->GetValue('uid');
  112. $aid = $this->GetValue('aid');
  113. $db->DoSql(&#092;"UPDATE artykuly SET u_id='$n_uid' WHERE a_id=$aid\");
  114. if ($db->DBError) echo &#092;"Nieudana aktualizacja rekordu! Linia: \".__LINE__.\" w pliku \".__FILE__.\"<br>\";
  115. }
  116. unset($db);
  117. }
  118. }
  119.  
  120. ?>


plik db_class.inc.php

  1. <?php
  2. /*
  3.  
  4. @Projekt:  System Ocen Artykułów
  5. @Plik: artykuly_class.inc.php
  6. @Opis: Obłsuga i zarządzanie baza danych
  7. @Data:  12 maj 2005
  8. @Autor:  Marcin Bancerz
  9. @Inne: Praca zaliczeniowa z przedmiotu P.S.I.
  10.  
  11. */
  12.  
  13. class db
  14. {
  15. var $dbhost; // serwer bazy danych
  16. var $dbuser; // uzytkownik bazy danych
  17. var $dbpass; // haslo do bazy danych
  18. var $dbbase; // nazwa bazy danych
  19. var $h_dblink; // uchwyt do polaczenia
  20. var $h_dbbase; // uchwyt do wybranej bazy
  21. var $result; // wartosc wyniku zapytania
  22. var $DBError;  // przechowuje stan bledu
  23.  
  24. // konstruktor klasy
  25. function db()
  26. {
  27. $this->dbhost = &#092;"xxx\";
  28. $this->dbuser = &#092;"xxxt\";
  29. $this->dbpass = &#092;"xxx\";
  30. $this->dbbase = &#092;"xx\";
  31. $this->h_dblink = mysql_connect($this->dbhost,$this->dbuser,$this->dbpass) or $this->DBError = True;
  32. $this->h_dbbase = mysql_select_db($this->dbbase) or $this->DBError = True;
  33. if ($this->DBError)
  34. {
  35. echo &#092;"BŁĄD POŁĄCZENIA Z BAZĄ DANYCH!!!!\";
  36. }
  37. }
  38.  
  39. // wykonuje zapytanie SQL
  40. function DoSql($sql)
  41. {
  42. $this->result = mysql_query($sql,$this->h_dblink);// or $this->DBError = True;
  43. }
  44.  
  45. // zwraca wiersz w postaci tablicy
  46. function Result()
  47. {
  48. return mysql_fetch_row($this->result);// or $this->DBError = True;
  49. }
  50.  
  51. // zwraca liczbe wierszy z zapytania
  52. function NumOfRows()
  53. {
  54. return mysql_num_rows($this->result,$this->h_dblink);// or $this->DBError = True;
  55. }
  56.  
  57. // zwraca id dodanego rekordu
  58. function AddedID()
  59. {
  60. return mysql_insert_id($this->h_dblink);
  61. }
  62. }
  63.  
  64. ?>


plik index.php (do testow, zadnego interfejsu jeszcze nie ma):

  1. <html>
  2.  
  3. <head>
  4. <meta http-equiv=\"content-type\" content=\"text/html; charset=iso-8859-2\">
  5. <title></title>
  6. </head>
  7.  
  8. <body>
  9.  
  10. <?php
  11. //ini_set(\"display_errors\",0);
  12. //error_reporting(0);
  13. include 'db_class.inc.php';
  14. include 'artykuly_class.inc.php';
  15.  
  16. $art = new artykuly();
  17. $art->GetArticle(1);
  18. $art->SetValue('uid',5);
  19. echo &#092;"Powinno<pre>\";
  20. print_r($art->artykul);
  21. echo &#092;"</pre>Jest\";
  22. $art->SaveArticle();
  23. $art->GetArticle(1);
  24.  echo &#092;"<pre>\";
  25. print_r($art->artykul);
  26. echo &#092;"</pre>\";
  27.  
  28. unset($art);
  29.  
  30. ?>
  31.  
  32. </body>
  33.  
  34. </html>


na koniec dodam strukture bazy:

  1. /*
  2. Created 2005-05-12
  3. Modified 2005-05-12
  4. Project System ocen artykułów
  5. Model SOA
  6. Company FallNet Webdesign
  7. Author Marcin Bancerz
  8. Version 1.0
  9. Database mySQL 4.0
  10. */
  11.  
  12. DROP TABLE IF EXISTS komentarze;
  13. DROP TABLE IF EXISTS artykuly;
  14. DROP TABLE IF EXISTS uzytkownicy;
  15.  
  16. CREATE TABLE uzytkownicy (
  17. u_id Int NOT NULL AUTO_INCREMENT,
  18. u_nick Varchar(20),
  19. u_email Varchar(20),
  20. PRIMARY KEY (u_id)) TYPE = MyISAM
  21. ROW_FORMAT = DEFAULT;
  22.  
  23. CREATE TABLE artykuly (
  24. a_id Int NOT NULL AUTO_INCREMENT,
  25. u_id Int NOT NULL,
  26. a_tytul Tinytext,
  27. a_tresc Text,
  28. a_data Timestamp(14),
  29. PRIMARY KEY (a_id)) TYPE = MyISAM
  30. ROW_FORMAT = DEFAULT;
  31.  
  32. CREATE TABLE komentarze (
  33. k_id Int NOT NULL AUTO_INCREMENT,
  34. u_id Int NOT NULL,
  35. a_id Int NOT NULL,
  36. k_tytul Tinytext,
  37. k_tresc Text,
  38. a_ocena Tinyint,
  39. a_data Timestamp(14),
  40. PRIMARY KEY (k_id)) TYPE = MyISAM
  41. ROW_FORMAT = DEFAULT;
  42.  
  43. ALTER TABLE artykuly ADD INDEX IX_napisal (u_id);
  44. ALTER TABLE artykuly ADD FOREIGN KEY (u_id) REFERENCES uzytkownicy (u_id) ON DELETE restrict ON UPDATE restrict;
  45. ALTER TABLE komentarze ADD INDEX IX_komentuje (u_id);
  46. ALTER TABLE komentarze ADD FOREIGN KEY (u_id) REFERENCES uzytkownicy (u_id) ON DELETE restrict ON UPDATE restrict;
  47. ALTER TABLE komentarze ADD INDEX IX_jest_komentowany (a_id);
  48. ALTER TABLE komentarze ADD FOREIGN KEY (a_id) REFERENCES artykuly (a_id) ON DELETE restrict ON UPDATE restrict;




czy to co tutaj podalem ma chociaz cos wspolnego z php obiektowym? Co jest np niezgodne z tymi zasadami?

i mam maly problem z :

  1. <?php
  2.  
  3. function DoSql($sql)
  4. {
  5. $this->result = mysql_query($sql,$this->h_dblink) or $this->DBError = True;
  6. }
  7.  
  8. ?>


gdy tak mam niestety mysql_query nie wykonuje sie.. (dlatego jest // w orginale), chcialem po prostu zastapic Die() wlasna "obsluga błędów" (prowizoryczną) lecz taki zaspis nie działa.. jak sprawdzić czy mysql_query nie zwraca błędu?


pozdrawiam
Ociu
var $artykuly; powinno był array chyba ?
daj w konstruktorze $this -> db = new db; i poczytaj o singletonie.

Zamiast
  1. <?php
  2. // funkcja pobiera wartosc dla zmiennej
  3. function GetValue($zmienna)
  4. {
  5. return $this->artykul[$zmienna];
  6. }
  7. ?>


daj:
  1. <?php
  2. // funkcja pobiera wartosc dla zmiennej
  3. function GetValue($zmienna)
  4. {
  5. if(in_array($zmienna, $this -> artykul)) return $this->artykul[$zmienna];
  6. else return false;
  7. }
  8. ?>
Fallout
Cytat(Ociu @ 2005-05-12 18:01:04)
daj w konstruktorze $this -> db = new db; i poczytaj o singletonie.

Witam,

dzieki za wskazowki, czytalem o tym singletonie i... nie kapuje aarambo.gif
jako ze z programowanie obiektowym nie mialem nigdy do czynienia nie za bardzo potrafie sobie wyobrazic tego.. a konkretniej mowiac nie mam pojecia jak by to mialo u mnie w moim kodzie wygladac i jak dzialac i wogole po co winksmiley.jpg

ogolnie zasada

  1. <?php
  2. $this->db = new $db();
  3. ?>


a potem w kazdej z funkcji odwolanie do tej zmiennej

  1. <?php
  2. $this->db->DoSql(&#092;"blabla\");
  3. ?>


to jest ten singleton? Bo ja to rozumiem ze to jest odwolanie (jedne) do klasy i przypisanie do obiektu na ktorum tylko sie operuje..

juz sam nie wiem co pisze.. moze daloby rade przyklad na tym moim biednym kodzie pokazac zasade tego singletonu?

pozdrawiam i sorki ze tak męczę smile.gif
Marcin
bela
Nie smile.gif Singleton wzraca Ci zawsze tą samą instancje klasy :]
Czyli robisz Klasa::getInstance(); i zawsze dostaniesz ten sam obiekt smile.gif
sobstel
mysle ze spokojnie tez mozna uzyc global $db
Ociu
http://wiki.php.pl/index.php/Singleton
Wiecej nie trzeba.
Holyboy
kwetstia natury nazweniczej - dobra praktyka jest nazywac klasy z duzych liter, a metody i wlasciwosci (oraz inne zmienne) z malych, generalnie przyjely sie dwie notacje:
Odstepy w zmiennych sygnowane znakiem podkreslenia dolnego:
  1. <?php
  2.  
  3. class ExampleFoo extends Foo {
  4. var $foo_property;
  5.  
  6. function ExampleFoo() {}
  7.  
  8. function set_foo_property($new_value) {
  9. $this->foo_property = $new_value;
  10. }
  11. }
  12.  
  13. ?>

Odstepy w zmiennych sygnowane duza litera:
  1. <?php
  2.  
  3. class ExampleFoo extends Foo {
  4. var $fooProperty;
  5.  
  6. function ExampleFoo() {}
  7.  
  8. function setFooProperty($newValue) {
  9. $this->fooProperty = $newValue;
  10. }
  11. }
  12.  
  13. ?>


doprawdy Twoj kod czyta sie nieswojo - na pierwszy rzut oka nie moglem doszukac sie konstruktora smile.gif
bela
Cytat
kwetstia natury nazweniczej - dobra praktyka jest nazywac klasy z duzych liter, a metody i wlasciwosci (oraz inne zmienne) z malych, generalnie przyjely sie dwie notacje:


Nie do końca się zgodzę smile.gif Wszystko zależy od języka i standartów w nim przyjętych w takim C# zwykło zaczynać się wszystko z dużej ;] Tudzież wypadało wspomnieć o notacji węgierskiej i stosowaniu przedrostków ( kto stosuje ten stosuje, ja niestety nie ;D )
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.