Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasy - problem
Forum PHP.pl > Forum > Przedszkole
miszqa
Witam!!!

Mam taki problem. Chcialem napisac klase odnosnie wyswietlania danych z bazy.
Ale aby niepotrzebnie nie powielac zapytan chcialbym zrobic uniwersalny wpis.

I pojawia sie porblem gdyz
odnoszac sie do klasy w sposob
  1. <?php
  2.  
  3. $sql = &#092;"select....\";
  4. klasa -> wyswietl($dbname, $dbuser, $dbpass, $dbhost, $sql);
  5.  
  6.  
  7. ?>

klasy juz nie bede opisywal
ale problem jest taki ze podajac w odnosniku do klasy zmienna $sql z zapytaniem
klasa nie chce dzialac
nie wyciaga mi danych z bazy

co moze byc przyczyna takiego stanu rzeczy?

wielkie dzieki za odpowiedz

pozdrawiam
rogrog
nie wiem na jakiej podstawie wogóle ludzie mają ci odpowiedzieć jak nic nie wiadomo o tej twojej "klasie"

tak wogóle to brakuje ci $ przed nazwą klasy... zresztą na początek proponuję ci dać sobie spokój z tymi twoimi "klasami" i po prostu zrobić sobie pojedynczą funkcję... jeśli ci juz tak zależy
Yarecki
  1. <?php
  2. // Albo wpisujesz:
  3.  
  4. $objKlasa = new Klasa;
  5.  
  6. // i używasz:
  7. $objKlasa->wyswietl(...);
  8.  
  9. // albo nie wpisujesz tego pierwszego i używasz
  10. Klasa::wyswietl(...);
  11. ?>
miszqa
otoz chodzi o cos takiego

ze odwolujac sie do klasy
  1. <?php
  2.  
  3. $sql=&#092;"select....\";
  4. $klasa ->wyswietl ($dbname);
  5. //chcialbym zrobic zapis
  6. //$klasa ->wyswietl($dbname, $sql);
  7.  
  8. ?>

nie dziala mi opcja pobierania danych z bazy

klasa ma postac taka

  1. <?php
  2.  
  3. class {
  4. function wyswietl_news($dbname) //,$sql)
  5.     {
  6.         $ile = 10;
  7.         list($wszystkich)=mysql_fetch_row(mysql_db_query($dbname,&#092;"SELECT count(*) FROM newsy\")); 
  8.         $podstron=ceil($wszystkich/$ile); //ceil
  9.         
  10.         function skr_dane($tekst, $il_znakow) 
  11.         { 
  12.           if (strlen($tekst) > $il_znakow) 
  13.             return substr($tekst, 0, strrpos(substr($tekst, 0, $il_znakow), &#092;" \")); 
  14.           else return $tekst; 
  15.         } 
  16.                     
  17.         
  18.         $wynik = mysql_db_query($dbname,&#092;"SELECT left(news_tresc, 180) as tekst_skr,news_id,news_data,news_czas,news_naglowek FROM newsy ORDER BY
     
  19. ews_id DESC LIMIT\".($page*$ile).\",$ile\");
  20. //chcialbym aby bylo 
  21. //$wynik = ,ysql_db_query($dbname, $sql);
  22.          //   $sql = \"SELECT left(tresc, 180) as tekst_skr,news_id FROM newsy \"
  23.         //$wynik = mysql_query($sql) or die(mysql_error()); 
  24.         
  25.         echo \"<table border=1 width=100%>\";
  26.         while($w = mysql_fetch_assoc($wynik))  {
  27.             printf (\"<tr><td><b><small>%s&nbsp;&nbsp;%s</small><font color=\"#FF3300\">&nbsp;&nbsp;%s</font></b></td></tr>\", $w[\"news_data\"], $w[\"news_czas\"], $w[\"news_naglowek\"]);
  28.             printf (\"<tr><td>\".skr_dane($w['tekst_skr'], 160).'&nbsp;<br><a href=\"index.php?plik=9&news_id='.$w['news_id'].'\">wiecej...</a><br><br></td></tr>'    );
  29.             } 
  30.             mysql_free_result($wynik);
  31.         if($wszystkich>=$ile)    
  32.         {
  33.             // Przycisk \"poprzednia strona\"
  34.             echo \"<TR><TD><center>\";
  35.                 if ($page>0) {
  36.                     echo \"<a href=index.php?page=\".($page-1).\">Poprzednia</a>&nbsp;&nbsp;&nbsp;&nbsp;\"
  37.                 } else {
  38.                     echo \"Poprzednia&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"; 
  39.                 }
  40.                 if ($page<($podstron-1)) {
  41.                     echo \"<a href=index.php?page=\".($page+1).\">Nast&ecirc;pna</a><br>\"
  42.                 } else  {
  43.                     echo \"Nast&ecirc;pna<br>\"; 
  44.                 }
  45.             echo \"</center></td></tr>\";
  46.         }
  47.         echo \"</table>\"; 
  48.     }
  49. }
  50.  
  51. ?>

wszystko bylo by dobrze gdybym nie mial limitu wyswietlania danych na stronie
jak sie pozbywam limitu dziala ale jak jest limit nie chce
zalew
brak spacji po slowie limit
miszqa
zrobilem spacje i nadal nie dziala
rogrog
a ja ci mówie żebyś sie nie upierał że chcesz mieć tą swoją tak zwaną "klasę" bo to z klasą ma niewiele wspólnego tylko zrobił sobie pojedynczą funkcję! smile.gif
miszqa
widzisz ty nie rozumiesz problemu
nawet jesli jej nie wykorzystam chce wiedziec dlaczego dana klasa mi nie dziala. Zaczalem problem i chce go skonczyc. Widze ze ty latwo sie poddajesz. A akurat w tym przypadku potrzebna mi jest klasa i nie ma od tego dowolania bo nie chce mi sie 100 razy powtarzac tego samego kodu skoro moge go zapisac w klasie podajac tylko parametry. Nie robilbym sobie problemu jakbym mial uzyc takiej skladni nawet 10 razy ale jesli tego jest mnostwo i to w tym samym stylu mysle ze napisanie klasy bedzie bardziej ekonomiczniejsze w pracy.
Wiec moze ktos mi poda dlaczego klasa nie chce wyswietlac poprawnie danych. Czy pominalem jakis parametr czy ... sam juz nie wiem co?
rogrog
chłopie....

nie chodzi mi o to czy ci działa czy ci nie działa, tylko o to że mógłbys sobie dać na razie spokój z klasami czy też raczej "klasami" - w cudzysłowie... bo z tego co napisałes widać że nie umiesz np. ich zadeklarować czy też wykorzystać.

więc wywal class i zrób po prostu funkcje

  1. <?php
  2.  
  3. $sql=&#092;"select....\";
  4. wyswietl($dbname, $sql);
  5.  
  6. function wyswietl($dbname, $sql){
  7.  //no i tutaj ten Twój kod
  8. }
  9.  
  10. ?>



zreszta jak tam chcesz...


PS. mowi sie "bardziej ekonomicznie" albo "ekonomiczniej" ale nie "bardziej ekonomiczniej"
miszqa
ej a co za roznica czy napisze ta funkcje normalnie czy w klasie?questionmark.gif
poza tym widze ze jestes zlym nauczycielem skoro od razu odrzucasz cos? moze sam nie wiesz jak ominac ten problem i probujesz isc na latwizne. A jak juz napisalem zaczalem problem i chce go skonczyc. Jesli jestes taki dobry w te klocki to mysle ze powiesz mi gdzie popelniam blad. A jesli nie to bez sensu bedzie klotnia typu po co mi klasa. Po prostu moze mam taki kaprys i tyle. Chce napisac ta klase i koniec. I nie wazne czy bede z niej korzystal w sumie to juz nie powinno nikogo obchodzic ale chce wiedziec gdzie jest blad i dlaczego ona nie dziala.
rogrog
hehe bk....

dobra... jak nie chcesz zrozumiec że nie warto pisać takich niby-klas to ok... tylko ze klasy beda wolniejsze od funkcji... no i wogóle to bez sensu

podstawowy blad jaki jest w tym twoim kodzie: klasa nie ma wogóle nazwy! poza tym nie ma obiektu...

wiec jak juz, to powinno być np.

  1. wyswietlanie_newsow.class.php
  2. <?php
  3.  
  4. class wyswietlanie_newsow {
  5.  
  6. function wyswietlaj_news(){
  7. //...
  8. }
  9.  
  10. }
  11. ?>
  12.  
  13. index.php
  14. <?php
  15. require ( 'wyswietlanie_newsow.class.php' ); //dolaczenie pliku z klasa
  16.  
  17.  
  18. // v. 1 - z obiektem //
  19. $object = new wyswietlanie_newsow();
  20. $object -> wyswietlaj_news;
  21.  
  22. // v. 2 - bez obiektu //
  23. wyswietlanie_newsow::wyswietlaj_news()
  24.  
  25. ?>


Ps. Jaki nauczyciel - przeciez nie mozna ciebie uczyc jak nie przyjmujesz niczego do wiadomosci tylko "mam taki kaprys". "od razu odrzucasz cos" a nie mozna sie z czyms nie zgadzac?

i tak uwazam ze ta "klasa" jest bez sensu tongue.gif
miszqa
to ty tak uwazasz a ja uwazam inaczej to teraz wez zaimplementuj moj kod zrodlowy do swojej klasy i sprawdz czy ona dziala, w taki sposob jak to opisalem na samym poczatku.
rogrog
tu nie ma żadnej mojej klasy tylko ci pokazuje jak to powinno w ogóle wygladac...

bo tam u ciebie brakuje heh paru elementow tongue.gif

ok, to napisz mi dlaczego jest ci potrzebna klasa a nie moze byc funkcja??

poza tym w tym twoim kodzie masz jedna funkcje w drugiej tongue.gif smile.gif
M4chu
Cytat(miszqa @ 2004-08-02 14:38:39)
(...) teraz wez zaimplementuj moj kod zrodlowy do swojej klasy i sprawdz czy ona dziala, w taki sposob jak to opisalem na samym poczatku.

Nie dosc, ze nie sluchasz co ludzie do Ciebie mowia to jeszcze chcesz miec wszystko na talerzu smile.gif
Jesli juz na sile chcesz miec klase to rozpocznij od elementarnej wiedzy na temat klas, poczytaj o skladni, wogole o idei robienia klas. W Twoim przypadku to jest przerost formy nad trescia (inna sprawa, ze forma formy daje duzo do zyczenia winksmiley.jpg)
Rogrog: deklarowanie funkcji w funkcji jest dopuszczalne, nie zalecane, nie potrzebne, uczy zlych nawykow ale jest dopuszczalne smile.gif
pozdro
rogrog
@M4chu: dzięki za pomocny głos, wyraziłeś to co chcialem powiedzieć i chyba nie do konca mi wychodzilo smile.gif

Nie wiedziałem że można tak deklarować funkcje, dobrze wiedzieć smile.gif
miszqa
no dobra skoro mam miec zle nawyki
to pokazcie mi jak napisac funkcje wyswietlajaca i funkcje skracajaca wyrzucic poza funkcje wyswietlajaca.

Poza tym problem na poczatku dotyczyl dlaczego do klasy nie moge wrzucic zmiennej
ktora ma zawarta tresc odnosnie wyciagania danych z bazy
a nie pytac po co mi klasa
moja odpowiedz na wasze pytanie po co mi klasa - niech zostanie taka -> bo mam kaprys.
I chce sie wreszcie dowiedziec czy ktos wie dlaczego tak sie dzieje czy nie a nie po co mi to.
bo bedziemy sie zapetlac w pustoslowiach. Poprostu potrzebuje zwiezlej odpowiedzi. Poza tym nie czekam na gotowca bo sam juz wiekszosc napisalem ale chce sobie sprobowac czegos nowego. Jak bym mial prosic o napisanie to bym nie dal mojego przykladu bo bym go nie mial. Chodzi mi tylko jak to co mialem napisane zrobic aby dzialalo. No i pojawil sie kolejny watek jak wyrzucic funkcje w funkcji poza funkcje czyli funkcje skracajaca. To latwe by bylo gdybym nie zrobil dodatkowej funkcji wyswietlajacej danych ktora zawiera owa funkcje.

Bede wdzieczny jesli albo ktos mnie naprowadzi jakie zmienne potrzebuje do wyprowadzenia albo pokaze na jakims przykladzie pokrewnym lub moim.

pozdrawiam
rogrog
nieuzasadnione używanie klas to tez zły nawyk... to tak jakbyś wynajmował
ciężarówkę żeby przewieźć jedną torbę...

ec smile.gif już więcej się nie wypowiem w tym temacie biggrin.gif szczególnie że sam mnie oskarżasz o to, że z góry coś odrzucam a sam niczego nie chcesz przyjąć do wiadomości.. i... ech zresztą... nieważne rób jak chcesz
miszqa
roqrog widzisz ty mnie nie mozesz zrozumiec i piszesz mi o nawykach nie wiedzac ze to bedzie czescia duzego projektu
dlatego dalem maly przyklad aby nie rozpisywac listingu na kilkatysiecy linii (ok3000) a wiec albo pomozecie albo nie piszcie nie potrzebnych postow
Dabroz
Sorry ze sie wtrace, ale to co piszesz jest napisane obiektowo pod wzgledem kodu. Ale nie logiki! Przeciez rownie dobrze mozesz wziac dowolny kod strukturalny i wrzucic go do jednej fukncji w jednej klasie i cieszyc sie "obiektowoscia". Spojrz na taki kod:
  1. <?php
  2.  
  3. include('inc.php');
  4.  
  5. include('base/news.php');
  6.  
  7. $smarty->loadfile('index');
  8.  
  9. $news->select(3);
  10.  
  11. $smarty->set('newsdata',$news->data());
  12.  
  13. include('out.php');
  14.  
  15. ?>


PS. To fragment wiekszego projektu (CMS'a) ale nie ma to znaczenia. Ale jak powtarza Scanner: obiektowo trzeba umiec myslec, a nie tylko pisac smile.gif
M4chu
miszqa: proponuje zebys zaczal pisac jakie bledy dostajesz. Jesli oczekuesz od nas pomocy, to w Twoim interesie jest wyrazanie sie precyzyjnie i wyczerpujaco.
Nie wklejaj calego kodu tylko fragment (kluczowa funkcja, petla czy wyrazenei), ktore powoduje blad.
Jeszcze raz, jesli oczekusz pomocy to wklejaj bledy jakie przegladarka ukazuje, piszesz, ze funckja wyswietl_newsa() dziala bez limitu, ale ona NIE MOZE dzialac, bo nie ma nazwy klasy. Rozumiem, ze nie chcesz wklajac nam calego projektu ale bez przesady smile.gif
miszqa
M4chu: No wlasnie wywala mi blad wykonywania petli while czyli wyswietlania
a jesli nie wrzucam opcji LIMIT dziala elegancko ale jak tylko ja dodam to od razu sie krzaczy
DeyV
ehh... Przykro się czyta ten temat.
Z jednej strony jest człowiek, który nie do końca potrafi przedstawić swój problem.

Z drugiej - kilka osób, któe chcą przedstawić swoje racje, nie interesując się przedstawionym problemem.

A przecież wnieski z tego płynące - są proste.

1. w dzisiejszych czasach konieczne jest pisanie obiektowe.
2. Aby móc to robić - potrzeba poznać składnię tworzenia klas - i pamiętać o tym, że np. klasa musi mieć nazwę winksmiley.jpg ( http://pl2.php.net/manual/pl/ref.classobj.php )
3. Nikt nie nauczy się pisać obiektowo, jeśli nie zacznie tego robić, nawet jeśli na początku powstają takie potworki. I nie można od razu zarzucać, że to lepiej byłoby zrobić strukturalnie - lepiej jest pokazać, jaką strukturę powinna mieć dana klasa.

4. Należy pamiętać, że im mniejsze, i bardziej wyspecjalizowane funkcje, tym lepiej. Szczególnie w tym przypadku, gdzie bardzo wyraznie widać fragment kodu służący do pobierania danych, fragment do wyświetlania newsów, wyświetlanie strzałek...
w skrócie - można by to zrobić np. tak (nie będę pisał całego kodu, postaram się również opierać na tym, co już napisałeś)
  1. <?php
  2.  
  3. class Sql
  4. {
  5. var $sDbName;
  6. var $sDbPass; 
  7. var $sDbUser;
  8.  
  9. var $mDbResource;
  10.  
  11. function Sql( $sDbName, $sDbUser, $sDbPass )
  12. {
  13. $this->mDbResource = mysql_connect( $sDbUser, $sDbPass );
  14. mysql_select_db( $sDbName , $this->mDbResource );
  15. }
  16.  
  17. function query( $sQuery )
  18. {
  19. return ( mysql_query( $sQuery, $this->mDbResource ) or echo 'Błąd w zapytaniu '. $sQuery );
  20. }
  21. }
  22.  
  23.  
  24. class Newsy
  25. {
  26. var $iIloscNewsow = null;
  27. var $iIleOnPage = 10;
  28. var $mQueryIdent;
  29.  
  30. function Newsy( &$Sql )
  31. {
  32. $this->Sql =& $Sql; 
  33. $this->getCount();
  34. }
  35.  
  36. function getCount()
  37. {
  38. if( isset( $this->iIloscNewsow ) )
  39. {
  40. return $this->iIloscNewsow;
  41. }
  42. $aRow = mysql_fetch_row( $this->Sql->query( 'SELECT Count(*) FROM .... ') );
  43. return $this->iIloscNewsow = $aRow[0];
  44. }
  45.  
  46. function getData( $iPageNumber=)
  47. {
  48. $this->mQueryIdent = $this->Sql->query( 'SELECT * FROM .... 
  49. LIMIT ' .( $this->iIleOnPage * $iPageNumber) .','. $this->iIleOnPage );
  50. }
  51.  
  52. function getRow()
  53. {
  54. return mysql_fetch_assoc( $this->mQueryIdent );
  55. }
  56.  
  57. function display()
  58. {
  59. echo &#092;"<table border=1 width=100%>\";
  60. while( $aWiersz = $this->getRow() )
  61. {
  62. echo '<tr><td><b><small>' . $this->cutText( $aWiersz['cos tam'], 100 ) . 
  63. '</td> </tr>' ;
  64. } 
  65. echo '</table>';
  66.  
  67. $this->displayStrzalki();
  68. }
  69.  
  70. function displayStrzalki() 
  71. {
  72. // nice name;) 
  73. }
  74.  
  75.  
  76. function cutText($tekst, $il_znakow)
  77. {
  78. if (strlen($tekst) > $il_znakow)
  79. {
  80. return substr($tekst, 0, strrpos(substr($tekst, 0, $il_znakow), &#092;" \"));
  81.  
  82. }else return $tekst;
  83. } 
  84. }
  85.  
  86. $Sql = new Sql( 'nazwa_bazy', 'user', 'haslo');
  87.  
  88. $Newsy = new Newsy( $Sql );
  89.  
  90. $Newsy->getData( (int) $_REQUEST['numer_strony'] );
  91.  
  92. $Newsy->display();
  93. ?>


Nie testowałem tego kodu, ale myślę, że dosyć dobrze przedstawia on ideę, i możliwości z niej płynące.
miszqa
1. nareszcie ktos pomyslal i nie czepia sie po co mi klasa tylko daje odpowiedz za ktora bardzo dziekuje. Wreszcie kogos nie obchodzi idea czy potrzebna jest klasa czy nie ile sam problem dzialania klasy. To sie chwali. Wiem ze i tamci pewnie mieli troszke racji ale... podalem konkretny przyklad i chcialem konkrentej odpowiedzi... a tu sie zaczely pytania po co, na co i do czego. Strukturalnie to mialem wykonane ale chcialem sobie uproscic kod i nie ladowac do pliku mnostwo takich samych rzeczy ze zmienionym zapytaniem.

2. Mam jeszcze Devy mala prosbe czy moglbys powtykac troszke komentarzy bo proste klasy juz pisalem a ta jak dla mnie jest troszke skomplikowana

3. Wielkie dzieki wszystkim krzykaczom i realnym czytelnikom problemow lol
Seth
Cytat(DeyV @ 2004-08-03 10:02:45)
2. Aby móc to robić - potrzeba poznać składnię tworzenia klas - i pamiętać o tym, że np. klasa musi mieć nazwę winksmiley.jpg ( http://pl2.php.net/manual/pl/ref.classobj.php )

2. a) Klasy to tylko czesc OOP. Aby rzeczywiscie uzywac techniki OOP i jej dobrodziejstw trzeba poznac filozofie pisania kodu w OOP.
Na poczatek zacznij od tego http://pl.wikipedia.org/wiki/Programowanie_obiektowe potem trzeba sie zaczac doksztalcac na "wlasne google" winksmiley.jpg
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.