Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa do obsługi bazy danych?
Forum PHP.pl > Forum > PHP
Joachim Peters
Witam,

Ostatnio zainteresowałem się klasami w php, obecnie chce zrobić sobie klase do obsługi zapytań SQL.
Napisałem sobie coś takiego:
  1. <?php
  2. class db
  3. {
  4. var $result; 
  5. function query()
  6. {
  7. $result = mysql_query($sql);
  8. $sql_query++; 
  9. return $result;
  10. }
  11. }
  12. ?>

lecz pojawia się błąd:
Fatal error: Call to a member function on a non-object in /home/daroo/public_html/index.php on line 53
Nie zabardzo rozumiem jednak co to jest var, jeżeli ktoś może mi powiedzieć i pomóc to byłbym wdzięczny.

Pozdrawiam
Ludvik
Nie masz zdefiniowanych zmiennych $sql i $sql_query. Poza tym wywołujesz metodę zmiennej, która nie jest obiektem - czyli po prostu jej nie ma. Słowo kluczowe var, mówiąc prościej, poprzedza deklarację zmiennej w klasie.
Joachim Peters
Cytat(Ludvik @ 25.06.2006, 19:44 ) *
Poza tym wywołujesz metodę zmiennej, która nie jest obiektem - czyli po prostu jej nie ma.


możesz mi to dokładniej wytłumaczyć?
Kirtan Loor
Witam,

  1. <?php
  2.  
  3. class db
  4. {
  5.  var $sql_query;
  6.  var $result;
  7.  
  8.  function query($sql)
  9.  {
  10. $this->result = mysql_query($sql);
  11. $this->sql_query++; 
  12. return $this->result;
  13.  }
  14. }
  15.  
  16. ?>
Joachim Peters
Wywołuje to tak:
  1. <?php
  2. $sql = "tresc zapytania";
  3. $db->query($sql);
  4. ?>


i pokazuje
Fatal error: Call to a member function on a non-object in /home/daroo/public_html/index.php on line 66

błąd
Kirtan Loor
http://pl.php.net/manual/en/language.oop.php - klasy i obiekty w php4
http://pl.php.net/manual/en/language.oop5.php - klasy i obiekty w php5

  1. <?php
  2.  
  3. include("plik.z.klasa.php");
  4.  
  5. #IMO potrzeba jeszcze polaczenia z mysql...
  6. $db = new database;
  7.  
  8. $sql = "SELECT...";
  9. $db->query($sql);
  10. ?>
Joachim Peters
teraz już nie ma tego błędu ale jest za to od mysql_fetch_array();
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/daroo/public_html/index.php on line 87
przed dodaniem klasy błędu nie było!
bo mam teraz tak:
  1. <?php
  2. ...
  3. $db->query($sql);
  4. while($row = mysql_fetch_array($result)) {
  5. ...
  6. }
  7. ...
  8. ?>
Kirtan Loor
Zastanawia mnie po co piszesz klase dla jednej metody...

  1. <?php
  2.  
  3. # Musisz przypisac do jakiejs zmiennej to co zwraca ci obiekt:>
  4. $result = $db->query($sql);
  5.  
  6. while( $row = mysql_fetch_array($result) )
  7. {
  8.  #....
  9.  #....
  10. }
  11. ?>
tuner
No, facet, kłaniają się duże braki w rozumieniu php ogólnie, a co dopiero w pracowaniu w OO.

  1. <?php
  2. $result = $db->query($sql);
  3. while($row = mysql_fetch_array($result)) {
  4. ...
  5. }
  6. ?>
Joachim Peters
Kolega wyżej mi tak napisał, nie znam się tak super...więc to zostawiłem :]
bim2
  1. <?php
  2.  
  3. class db
  4. {
  5. var $sql_query;
  6. var $result;
  7. function db(user, host....)
  8. {
  9. //tu polaczenie z baza
  10. }
  11. function query($sql)
  12. {
  13. $this->result = mysql_query($sql);
  14. $this->sql_query++; 
  15. return $this->result;
  16. }
  17. function fetch_array($fetch)
  18. {
  19. $fetch = mysql_fetch_array($fetch);
  20. return $fetcht;
  21. }
  22. //itd
  23. }
  24. $db=new db(user, localhost...);
  25. $q=$db->query("SELECT * FROM ble");
  26. while($db->fetch_array($q))
  27. {
  28. ...
  29. }
  30. ?>
Joachim Peters
Nie działa, wyświetla się biała strona smile.gif
bim2
bo to jest przykład withstupidsmiley.gif questionmark.gif
Joachim Peters
Podstawiłem swoją nazwe tabel itd. ;|
bim2
Dzizas, to jest przykład. Nie ma połączenia z bazą. tylko struktóra jak to ma wyglaądać. Dadzą ci karesorie auta i powiedz że nie działa?
Joachim Peters
Mam tak:
plik functions.php
  1. <?php
  2. class db
  3.  
  4. {
  5.  
  6. var $sql_query;
  7.  
  8. var $result;
  9.  
  10. function db()
  11.  
  12. {
  13.  
  14. DEFINE ('DB_USER', 'XXX');
  15. DEFINE ('DB_PASSWORD', 'xxx');
  16. DEFINE ('DB_HOST', 'xxx');
  17. DEFINE ('DB_NAME', 'XXX');
  18.  
  19. $dbc = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die ('Nie mogłem połączyć się z MySQL-em: ' . mysql_error() );
  20. @mysql_select_db(DB_NAME) OR die ('Nie udało mi się wybrać bazy danych: ' . mysql_error() );
  21.  
  22.  
  23. }
  24.  
  25. function query($sql)
  26.  
  27. {
  28.  
  29. $this->result = mysql_query($sql);
  30.  
  31. $this->sql_query++; 
  32.  
  33. return $this->result;
  34.  
  35. }
  36.  
  37. function fetch_array($fetch)
  38.  
  39. {
  40.  
  41. $fetch = mysql_fetch_array($fetch);
  42.  
  43. return $fetch;
  44.  
  45. }
  46.  
  47. //itd
  48.  
  49. }
  50.  
  51. $db=new db();
  52. ?>


i w index.php


  1. <?php
  2. include('functions.php');
  3.  
  4. $q=$db->query("SELECT * FROM phpbb_topics ORDER BY topic_last_post_id DESC LIMIT 5");
  5.  
  6. while($db->fetch_array($q))
  7. {
  8. echo $fetch['topic_title'];
  9. }
  10. ?>
bim2
Dodaj var $result; lbo w function_query() zamien $this->result na $result biggrin.gif
Joachim Peters
nadal to samo winksmiley.jpg
Może ktoś inny da mi jakąś propozycje?
NetJaro
Tak, ja mam. Zamiast zawracać innym głowę, zainstaluj sobie serwer na kompie (czyt. localhost) i naucz się, baw się w OO. A w ten czas gdy nie umiesz tego (chociaż mimo tego koniecznie chcesz coś wyskrobać [..) teraz rusz kursorem do działu Gotowe skrypty php i wybierz sobie z tamtąd fajną klasę do obsługi bazy MySQL - klasy zamieszczone tam na pewno działają.

Chętnie poświęcę czas dla kogoś, kto chce się nauczyć i ma problemy (czego nie rozumie?) ale jako ktoś nawet nie wie na czym polega programowanie obiektowe a zabiera się za to traci swój i innych czas.
W skrócie: Najpierw manual php -> manual MySQL -> Google.pl -> (dopiero teraz) Forum.php.pl.

Pozdro winksmiley.jpg
Ludvik
Ale to nie ma nic wspólnego z programowaniem obiektowym. To, że zamknął w taki sposób obsługę bazy danych, nie znaczy, że to jest OOP. Ja bym tego DAO nie nazwał.

Autorowi wątku polecam zapoznanie się z podstawami obsługi baz danych - gdybyś wiedział o co chodzi, to byś dał sobie radę. Zanim zaczniesz pisać warstwę abstrakcji, opanuj to, co chcesz ukryć.

  1. <?php
  2. class DB {
  3. public function __construct($host, $user, $password, $db) {
  4. $this->handle = mysql_connect($host, $user, $password);
  5. if (!$this->handle) {
  6. throw new Exception();
  7. }
  8. mysql_select_db($db, $this->handle);
  9.  }
  10.  
  11. public function query($query) {
  12. return mysql_query($query, $this->handle);
  13. }
  14.  
  15. public function fetchRow($resource) {
  16. return mysql_fetch_array($resource);
  17. }
  18.  
  19. public function fetchAll($resource) {
  20. $result = array();
  21. while ($row = $this->fetchRow($resource)) {
  22. $result[] = $row;
  23. }
  24. return $result;
  25. }
  26.  
  27. //...
  28.  
  29. protected $handle;
  30. }
  31. ?>

No i jeszcze przykład...
  1. <?php
  2. try {
  3. $db = new DB('localhost', 'user', 'password', 'database_name');
  4. } catch (Exception $e) {
  5. die ('Nie można nawiązać połączenia z bazą danych.');
  6. }
  7. $result = $db->query('SELECT * FROM table');
  8. $rows = $db->fetchAll($result);
  9.  
  10. foreach ($rows as $row) {
  11. echo implode(', ', $row);
  12. }
  13. ?>


Nie testowałem tego, pisane z głowy...
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.