Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Zapytanie w funkcji wyrzuca błąd, Klasy i funkcje
indexx
post
Post #1





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Witam

Mam pewien problem z klasami i funkcjami, otóż mam klasę do wykonywania zapytań itp:
  1. class db
  2. {
  3. (...)
  4. public function query($query){
  5. $dbquery = $this ->dbquery = mysql_query($query);
  6. if($this ->dbquery ==false) {echo "Nie można wykonać zapytania,<br />";
  7. echo mysql_errno() . ": " . mysql_error(). "\n";
  8. }
  9. return $this->dbquery;
  10. }
  11.  
  12. (...)
  13. }

i plik z różnymi funkcjami wywoływanymi ze skryptu np:
  1. function login() {
  2. (...)
  3. $db->query("INSERT INTO(...)");
  4. }



Moje pytanie brzmi, dlaczego wywala mi błąd gdy w funkcji "login" próbuję użyć "$db->query", zamiast tego muszę używać normalnie mysql_query i czy jest jakis sposób aby to obejśc lub wykonać?
Go to the top of the page
+Quote Post
ViX
post
Post #2





Grupa: Zarejestrowani
Postów: 114
Pomógł: 9
Dołączył: 19.11.2007
Skąd: Kraków

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


a może tak najpierw?
  1. $db = new db();
Go to the top of the page
+Quote Post
indexx
post
Post #3





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Cytat(ViX @ 22.02.2011, 13:19:16 ) *
a może tak najpierw?
  1. $db = new db();


To akurat raczej logiczne.


Nie dodałem, że w skrypcie wszystko jest ok, tylko gdy użyję $db->query w jakiejś funkcji wtedy nie działa.
Go to the top of the page
+Quote Post
PanGuzol
post
Post #4





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


Oraz nie dodałeś co to za błąd Ci wywala.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Oraz nie dodałeś co to za błąd Ci wywala.
Parafrazując autora tematu:
To raczej logiczne (IMG:style_emoticons/default/wink.gif)

@indexx nie pisz, że coś jest logiczne a coś innego nie, skoro dla Ciebie logicznie nie jest podanie dokładnie komunikatu błędu
Go to the top of the page
+Quote Post
indexx
post
Post #6





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Już daję, miał być wklejony pod kodem, przepraszam za błąd:

Kod
Fatal error: Call to a member function query() on a non-object in (..)


A kod odpowiedzialny:

Kod
$db->query("SELECT (...) LIMIT 1");
Go to the top of the page
+Quote Post
PanGuzol
post
Post #7





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


Zasięg zmiennych
Go to the top of the page
+Quote Post
indexx
post
Post #8





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


No i okazuje się, że wystarczyło pomyśleć.

Dzięki wielkie za pomoc.

Mam jeszcze pytanie czy lepiej teraz w każdej funkcji deklarować $db jako global i używać "$db->query", czy lepiej pozostać przy "mysql_query"
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Żadne z powyższych.

Google: wzorce projektowe.
Go to the top of the page
+Quote Post
indexx
post
Post #10





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Ok, skleciłem coś takiego:
  1. class db
  2. {
  3. (...)
  4.  
  5. public function query($query){
  6. $dbquery = $this ->dbquery = mysql_query($query);
  7. if($this ->dbquery ==false) {echo "Nie można wykonać zapytania,<br />";
  8. echo mysql_errno() . ": " . mysql_error(). "\n";
  9. }
  10. return $this->dbquery;
  11. }
  12.  
  13. (...)
  14. }

rozszerzenie klasy:
  1. class display extends db {
  2.  
  3. private $_all = array();
  4.  
  5. public function zlicz($tbl, $where, $paggin){
  6.  
  7. $sql = "SELECT count(*) AS licz FROM ".$tbl." ".(isset($where) ? 'WHERE '.$where : '')."";
  8. $result = $this->policz($sql);
  9. (isset($paggin) ? $res = ceil($result[0]/10) : $res = $result[0]);
  10. return $res;
  11. }
  12. public function select($dbs, $where, $order, $limit){
  13.  
  14. if($where != "brak"){$warunki = "WHERE $where";}else{$warunki = "";}
  15. $sql = "SELECT * FROM $dbs $warunki ".(isset($order) ? 'ORDER BY '.$order.' DESC' : '')." LIMIT $limit;";
  16. if ($results = $this->query($sql)){
  17. $rs = array();
  18.  
  19.  
  20.  
  21. while ($row = mysql_fetch_array($results)){
  22. $mx = array();
  23. foreach ($row as $key => $val):
  24. $mx[$key] = $val;
  25. endforeach;
  26. $this->_all[] = $mx;
  27.  
  28. };
  29.  
  30. // return $rs;
  31.  
  32. }else{
  33. echo 'Błąd pobrania danych mysql: ' . $this->error;
  34. return false;
  35. }
  36. }
  37. public function wyswietl_comments(){
  38. $comments = $this->_all;
  39. foreach($comments as $r)
  40. {
  41. echo '<div class="comment">
  42. <span class="autor">
  43. <img src="'.avatar($r["author"]).'">
  44. <a href="/profil/'.$r["author"].'">'.$r["author"].'</a>
  45. </span>
  46. <span class="com_p">'.$r["date"].'</span>
  47. <span class="com_glosowanie">
  48. Ocena: <span class="com_punkty">'.$r["ocena"].'</span>
  49. (głosów: <span class="com_count">'.$r["glosow"].'</span>)
  50. | <a href="#" onclick="msg_raport('.$r["id"].', \'komentarz\'); return false;" id="msg_komentarz_'.$r["id"].'">Raportuj</a>
  51. </span>
  52. <div class="com_content">'.$r["content"].'</div>
  53. <a class="com_odpowiedz" href="/'.$r["id_demot"].'/#komentarze_wybor">[Zobacz demotywator]</a>
  54. </div>';
  55. }
  56. }
  57. }


  1. a w skrypcie wywołuję tak:
  2. $display = new display();
  3. $display->select("tabela", "author='$login' and activ='0'", "date", "$pages[1],$pages[2]");
  4. echo $display->wyswietl_comments();


Moje pytanie, czy tak na początek może to wyglądać?
Czy za każdym razem muszę wywoływać
  1. $display = new display();


czy mogę równie dobrze na początku każdego pliku(raczej chyba nie ale wolę się spytać)

Co mogę poprawić i jakie usprawnienia wprowadzić? Tylko proszę o konkretne uwagi bo kolega "erix" mnie wręcz załamał (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




kolega erix podał ci słowo kluczowe: wzorce projektowe. Jakbyś poczytał to byś nie tworzył takich potworków jak teraz (IMG:style_emoticons/default/tongue.gif)

Po db nie powinna dziedziczyć żadna klasa do wyświetlania. To są zupełnie różne twory nie powiązane ze sobą przez dziedziczenie.

Poczytaj o wzorcu Rejestr, Singleton, poczytaj o MVC.
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post
indexx
post
Post #12





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Owszem czytałem ale jak na mój poziom to jest rzekł bym "zbyt zawiłe", a najlepiej uczę się na przykładach, które rozumiem.

Może ktoś mógł by mniej więcej pokazać mi jak przekształcić to co mam w coś funkcjonalnego i poprawnego żebym mógł zrozumieć co robię źle?
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Wzorce projektowe, konkretnie: MVC.

Jak tego nie zrozumiesz (głównego zamysłu), to zostaw programowanie.
Go to the top of the page
+Quote Post
fesseme
post
Post #14





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 6.07.2009

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


Dobrze omówione wzorce są w książce "PHP. Zaawansowane programowanie."
Go to the top of the page
+Quote Post
indexx
post
Post #15





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 20.06.2008

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


Dzięki za porady, książkę(inną), pożyczyłem już wczoraj za namową znajomego gdy opisałem mu sprawę.

A ogólne zarysy już łapię, teraz trochę po kombinować i nie będzie problemu.

Cytat
Jak tego nie zrozumiesz (głównego zamysłu), to zostaw programowanie.


Chyba raczej nie miało by to sensu, to tak jakby murarz nie umiał kłaść tynków więc pracuje w MAcu.
Jak czegoś nie rozumiem to staram się dwa razy bardziej więc nie będzie problemu (IMG:style_emoticons/default/smile.gif)

Temat do zamknięcia.


Pozdrawiam
Go to the top of the page
+Quote Post

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: 23.08.2025 - 22:01