Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] nie dzialaja metody rodzica w klasie dziedzinej
Forum PHP.pl > Forum > Przedszkole
become
  1. <?php
  2. Class myDB extends DB {
  3.  
  4.  function selectUsers($element) {
  5. $q="
  6. SELECT *
  7. FROM users
  8. WHERE id=$element
  9. ";
  10. $res=$this->getRow($q, array(), DB_FETCHMODE_ASSOC);
  11. if (PEAR::isError($res)) {
  12.  die($res->getMessage() . ' | ' . $res->getDebugInfo());
  13. }
  14.  }
  15.  
  16. }
  17. ?>


wywala błąd
Call to undefined method myDB::getRow()

getRow jest metodą clasy DB pakietu PEAR

próbowałem przez parent::getRow ale jest dokładnie to samo.
nospor
Prosze uzywac bbcode i poprawic pierwszy post

Do problemu:
az se sciagnalem ten pakiet. No moze ja slepy jestem, ale ja w klasie DB nie widze metody getRow(), wiec nie dziwie sie, ze i php jej nie widzi... tongue.gif

edit: metode taką znalazlem w klasie DB_common
become
no widzę teraz.
ze DB_common jest klasą interfejsu.

czy to oznacza, że muszę stworzyć osobną klase dziedziną dla tego interfejsu ?

bo w takim razie jakim cude działa to:
  1. <?php
  2. // Create a valid DB object named $db
  3. // at the beginning of your program...
  4. require_once 'DB.php';
  5.  
  6. $db =& DB::connect('pgsql://usr:pw@localhost/dbnam');
  7. if (PEAR::isError($db)) {
  8. die($db->getMessage());
  9. }
  10.  
  11. // Proceed with a query...
  12. $res =& $db->query('SELECT * FROM clients');
  13.  
  14. // Always check that result is not an error
  15. if (PEAR::isError($res)) {
  16. die($res->getMessage());
  17. }
  18. ?>


skoro metoda query tez nie istnieje w clasie DB

co wogole oznacza znak "&" przed wywolaniem metod ?
nospor
Cytat
skoro metoda query tez nie istnieje w clasie DB
no ale ty zobacz co zwraca metoda connect, a potem sie pytaj.
connect zwraca obiekt innej klasy niz klasa DB. i akurat te inne obiekty maja to co trzeba. W twoim wypadku jest to obiekt klasy DB_pgsql

Cytat
co wogole oznacza znak "&" przed wywolaniem metod ?
Ze chcesz referencje do tego co zwraca
become
no dobrze.
to czy istnieje jakas metoda rozszerzenia klasy DB w taki sposob aby miec dostep do metod klas obiektow zwracanych przez DB ?
nospor
ale ci ciagle chodzi o te getRow() ? No to twoja klasa musi dziedziczyc po DB_common

Jesli nadal ci oto nie chodzi, to napisz co chcesz osiągnąć.
become
chce sobie napisac klasę, w ktorej umieszcze rozne funkcje dotyczace dodawania uzytkownika, usuwania, modyfikacji danych na bazie.

chcialbym do tego celu wykorzystac klase DB.

czyli np.

mojaKlasa->DodajUsera("imie","nazwisko");

w metodzie DodajUsera bedzie tworzony jakis kod SQL.
a nastepnie dodajUsera skorzysta z metody query clasy DB_common pakietu DB.

podobnie jezeli chodzi o pobieranie danych i korzystanie z metod klasy DB_result.
nospor
Cytat
a nastepnie dodajUsera skorzysta z metody query clasy DB_common pakietu DB.

no to w czym problem? napisalem przeciez: klasa ma dziedziczyc po DB_common

Cytat
podobnie jezeli chodzi o pobieranie danych i korzystanie z metod klasy DB_result.
No to zobacz teraz co robi query() z klasy common:
  1. <?php
  2. //....
  3. else {
  4. $tmp =& new DB_result($this, $result);
  5. return $tmp;
  6. }
  7. //...
  8. ?>
become
sory, ale nie mam zielonego pojecia jak to zrobic ... moze jakis przyklad ?

  1. <?php
  2. Class myDB_common extends DB_common {
  3.  
  4.  function selectUsers($element) {
  5. $q="
  6. SELECT *
  7. FROM users
  8. WHERE id=$element
  9. ";
  10. $res=$this->getRow($q, array(), DB_FETCHMODE_ASSOC);
  11. if (PEAR::isError($res)) {
  12.  die($res->getMessage() . ' | ' . $res->getDebugInfo());
  13. }
  14.  }
  15. }
  16. ?>


jezeli polacze sie tworzac nowy obiekt z klasy DB

$db =& DB::connect($dsn, $options);

to przeciez w wyniku mam obiekt klasy DB_common a nie myDB_common i nie bede mial dostepu do metody selectUser
nospor
no ale przeciez zobacz jeszcze raz co robi connect. ona zwraca obiekt takiej klasy, jaki masz zadeklarowany w $dsn. wczesniej zwracal ci DB_pgsql, bo miales: pgsql://usr:pw@localhost/dbnam'

Jak chcesz by ci zwracal twoją klase to masz miec:mytype://usr:pw@localhost/dbnam'
a klasa ma sie nazywac: DB_mytype i lezec w pliku o nazwie: mytype.php.
become
ludzie - czy to musi byc tak zagmatwane ?

ja chce korzystac z wszystkich metod należących do klas DB, DB_common, DB_result w swojej wlasnej klasie, ktora bedzie zawierala konkretne metody - dodaj uzytkownika, modyfikuj dane itp[.

szybciej zrobie to tworzac plik z funkcjami, gdzie w kazdej funkcji bede tworzyl nowy obiekt polaczenia z baza i sprawa zalatwiona
nospor
Cytat
ludzie - czy to musi byc tak zagmatwane ?
a czy to moja wina zes sie uczepil tego PEARa? smile.gif

pozatym co ty w tym skomplikowanego? Nadac nazwe klasy wedlug pewnego schematu?
Byc moze mozna to zrobic inaczej, nie wiem, pear w zyciu nie uzywalem, sciagnalem go sobie teraz na potrzeby tego topicu i drogą dedukcji mowie ci jak oni to maja smile.gif
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.