Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zapytanie w funkcji wyrzuca błąd
Forum PHP.pl > Forum > Przedszkole
indexx
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ć?
ViX
a może tak najpierw?
  1. $db = new db();
indexx
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.
PanGuzol
Oraz nie dodałeś co to za błąd Ci wywala.
nospor
Cytat
Oraz nie dodałeś co to za błąd Ci wywala.
Parafrazując autora tematu:
To raczej logiczne 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
indexx
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");
PanGuzol
Zasięg zmiennych
indexx
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"
erix
Żadne z powyższych.

Google: wzorce projektowe.
indexx
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ł smile.gif
nospor
kolega erix podał ci słowo kluczowe: wzorce projektowe. Jakbyś poczytał to byś nie tworzył takich potworków jak teraz 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.
indexx
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?
erix
Wzorce projektowe, konkretnie: MVC.

Jak tego nie zrozumiesz (głównego zamysłu), to zostaw programowanie.
fesseme
Dobrze omówione wzorce są w książce "PHP. Zaawansowane programowanie."
indexx
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 smile.gif

Temat do zamknięcia.


Pozdrawiam
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.