Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa bazy danych, Problem z klasą do obsługi bazy danych
Diwi
post
Post #1





Grupa: Zarejestrowani
Postów: 245
Pomógł: 4
Dołączył: 22.01.2005

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


A więc mam sobie taką oto klasę do obsługi bazy danych:

  1. <?php
  2.  
  3. class db {
  4.  
  5. var $connect, $sd;
  6.  
  7.  
  8. function db() {
  9.  
  10. $this->connect = mysql_connect('localhost', 'root', 'gameforce') OR DIE (&#092;"Nie mogłem połączyć się z MySQL-em\");
  11. $this->sd = mysql_select_db('**') OR DIE ('Nie mogłem połączyć się z bazą danych: **');
  12.  
  13.  }
  14.  
  15. function query($z) {
  16.  
  17. @mysql_query(&#092;"$z\", $this->connect) OR DIE ('Błąd zapytania SQL: <br /><b>'.mysql_errno().' : '.mysql_error().'</b>');
  18.  
  19. } // function pytanie
  20.  
  21. function num_rows($query) {
  22.  
  23. @mysql_num_rows($query) OR DIE ('Błąd bazy danych: '.mysql_error());
  24.  
  25.  }
  26.  
  27. function fetch($pytanie) {
  28.  
  29. @mysql_fetch_assoc($pytanie, $this->connect) OR DIE ('Błąd bazy danych: '.mysql_error());
  30.  
  31.  }
  32.  
  33.  } // koniec klasy
  34.  
  35. ?>


Chyba wiadomo jak to działa: mamy konstruktor który przy wywołaniu odrazu otwiera połączenie z bazą danych + pare funkcji

Teraz mam klase do obsługi newsów "news" i chce wyświetlić newsy.

  1. <?php
  2.  
  3. if (eregi('news.php', $_SERVER['PHP_SELF'])) {
  4. exit('Hacking Attempt !!');
  5.  }
  6.  
  7. include_once('./config/db.lib.php');
  8. include_once('./templates/smarty.class.php');
  9. class news {
  10.  
  11. var $db, $tpl;
  12. function news() {
  13.  
  14. $this->db = new db;
  15. $this->tpl = new smarty;
  16. $this->tpl->template_dir = 'templates/tpl';
  17. $this->tpl->compile_dir = 'templates/tpl_c';
  18.  
  19.  }
  20.  
  21. function wyswietl_newsy() {
  22.  
  23. $result = $this->db->query(&#092;"SELECT * FROM `news` ORDER BY `add_date` DESC\");
  24.  
  25. while($row = $this->db->fetch($result)) {
  26.  // tutaj sobie robimy różne rzeczy na SMARTY
  27. }
  28.  
  29. }
  30. }
  31.  
  32. $news = new news;
  33. $news->wyswietl_newsy();
  34. ?>


Wydaje mi się że wszystko jest dobrze smile.gif. Lecz dostaje komunikat:

Kod
Błąd bazy danych:


Jak widać w klasie DB jest ustawione raportowanie błędów lecz po "Błąd bazy danych:" powinien się wyświetlić komunikat

Po usunięciu warunku OR DIE a także znaku @ przed funkcją dostaje taki komunikat:

Kod
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\WebServ\httpd\aa\config\db.lib.php on line 31


Zaznaczam że zapytanie SQL które wykonuje jest poprawne smile.gif

Co tu się dzieje questionmark.gif

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post
Post #2





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




funkcja query() nie zwraca ci nic. a ty mimo wszystko z niej cos pobierasz, a potem to cos (czyli nic), przekazuje do fetch. A w fetch masz mysql_fetch_assoc, której argumentem nie może być nic. Kapisz?

Funkcja query powinna zwracac wynik funkcji mysql_query


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SHiP
post
Post #3





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

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


Ja bym to zrobił tak

  1. <?php
  2.  
  3.   function sql_query($query) 
  4.   { 
  5.     if(!$this -> result = @mysql_query($query)) $this -> errors[]=&#092;"Błędne zapytanie\";
  6.   }
  7.  
  8. ?>


I wtedy funkcje do wyciągania danych z bazy..

  1. <?php
  2.  
  3.   function sql_fetch_array($method) 
  4.   { 
  5.    if($method>|| $method<1) return 0; 
  6.     /*
  7.     1=ASSOC 
  8.     2=NUM 
  9.     3=BOTH (ASSOC + NUM) 
  10.     */ 
  11.     return @mysql_fetch_array($this -> result,$method);
  12.   }
  13.  
  14. ?>


Ten post edytował SHiP 1.04.2005, 16:03:13


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Diwi
post
Post #4





Grupa: Zarejestrowani
Postów: 245
Pomógł: 4
Dołączył: 22.01.2005

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


Acha czyli musze dać return ?

Myśle o czymś takim:

  1. <?php
  2.  
  3. // ...
  4. function query($z) {
  5.  
  6. return @mysql_query(&#092;"$z\", $this->connect) OR DIE ('Błąd zapytania SQL: <br /><b>'.mysql_errno().' : '.mysql_error().'</b>');
  7.  
  8. } // function query
  9.  
  10. // ...
  11. ?>


Coś takiego powinno działać questionmark.gif

Pozdrawiam

Ten post edytował Diwi 1.04.2005, 15:59:40
Go to the top of the page
+Quote Post
SHiP
post
Post #5





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

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


Musisz po prostu rezultat funkcji mysql_query przypisać do jakiejść zmiennej - u mnie $this -> result

Tylko wtedy wyświetlanie będzie lekko inne
  1. <?
  2. $db -> sql_query(&#092;"SELECT * FROM `news` ORDER BY `add_date` DESC\");
  3. while($row = $db -> sql_fetch_array(1))
  4. {
  5. coś tam
  6. }
  7. ?>


Poza tym nie ruzumiem poco tworzyć obiekt jako zmienną klasy. Ja bym obiekt $db stworzył poza klasą news. I udostępnił go globalnie w wybranych funkcjach.

Ten post edytował SHiP 1.04.2005, 16:12:00


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
dasko
post
Post #6





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

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


@SHiP: Głupi jest pomysł z przetrzymywaniem wyniku zapytania w $this->result. Takie rozwiązanie pozwala na istnienie tylko jednego wyniku w jednym czasie.

Wg mnie, najlepiej jest stworzyć klasę Result, która będzie zawierała wynik zapytania i metody operujące na wyniku SQL(fetchArray(), fetchObject, numRows() itd.) i właśnie instancję takiej klasy zwracać z metody db::sql_query() smile.gif
Go to the top of the page
+Quote Post
Ociu
post
Post #7





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Ja to zrobiłem tak:
  1. <?php
  2. # var $sql_result; etc.
  3. function query($sql)
  4. {
  5. $this -> sql_result = '';
  6.  
  7. $start = $this -> _get_time();
  8. if ($this -> connected && $this -> selected) # sprawdza czy jest polaczenie
  9. {
  10.  
  11. $this -> sql_result = mysql_query($sql, $this -> connected);
  12.  
  13. if(!$this -> sql_result)
  14. {
  15. $this -> err('query');
  16. return false;
  17. } else {
  18. $this -> execute++; #liczy zapytania
  19. return true;
  20. }
  21. } else {
  22. $this -> err('notconnect');
  23. }
  24. }
  25. ?>


fetch_row:
  1. <?php
  2. function fetch_row($fetch_row = '')
  3. {
  4. $fetch_row = ((empty($fetch_row)) ? $this -> sql_result : $fetch_row);
  5.  
  6. $r = mysql_fetch_array($fetch_row);
  7.  
  8. if($r)
  9. {
  10. return $r;  
  11. } else {
  12.  return false;
  13.  
  14. }
  15. }
  16. ?>
Go to the top of the page
+Quote Post

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 Aktualny czas: 19.08.2025 - 05:21