Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z obiektem funkcji Query
Forum PHP.pl > Forum > PHP
markkoo99
Witam,
Mam problem z tworzeniem obiektu. Wyskauje mi taki błąd:

Fatal error: Call to a member function Query() on a non-object in C:\WebSerwer\Apache2\Apache2\htdocs\sklep_inz\aplication\apcore.php on line 46

To cześć kodu gdzie ten błąd jest generowany:
  1. <?php
  2.  
  3. //Dołączenie pliku konfiguracyjnego
  4. require_once(APP_DIR.'/configuration/define.php');
  5. require_once(APP_DIR.'/aplication/comunication.php');
  6. require_once(APP_DIR.'/aplication/object.php');
  7.  
  8. //Klasa bazowa PEAR
  9. require_once('PEAR.php');
  10. require_once('DB.php');
  11.  
  12. include_once('public.php');
  13.  
  14. //Moduły sklepu -------------------------------START ----------------------
  15. //Katalog
  16. require_once(APP_DIR.'/modules/catalog.php');
  17. //-----------------------KONIEC------------------------------
  18.  
  19.  
  20. class AppCore {
  21.  
  22. private static $_appInitialized;
  23. /**
  24. * Obiekt PEAR pamiętający połączenie z bazą danych
  25. */
  26. public static $_dataBaseConnection;
  27. private function __construct() {}
  28.  
  29. public static function initializeApplication() {
  30.  
  31. //Inicjacja przeprowadzana tylko jeden raz
  32. if (self::$_appInitialized) return;
  33.  
  34. //Próba nawiązania połączenia z bazą danych
  35.  
  36. if (PEAR::isError(self::$_dataBaseConnection = DB::connect(DSNInit()))) {
  37.  
  38. if (LOG_WRITE) self::$_logObject->log('Nie można nawiązać połączenia z bazą danych. Przyczyna: '.self::$_dataBaseConnection->getMessage(), LOG_ERR);
  39. throw new Error('dbconnectionerror');
  40. }
  41.  
  42. }
  43.  
  44.  
  45. public function Query($queryString) {
  46. return self::$_dataBaseConnection->Query($queryString);
  47. }
  48. /**
  49. * Metoda obiera ilość wierszy objętych działaniem polecenia
  50. * INSERT, UPDATE lub DELETE
  51. * @return mixed
  52. */
  53.  
  54. public static function AffectedRows() {
  55. return self::$_dataBaseConnection->affectedRows();
  56. }
  57. /**
  58. * Metoda zwraca obiekt połączenia z bazą danych
  59. */
  60. }
  61.  
  62. /*
  63. try {
  64. if (isset($_GET['admin'])) {
  65. include_once('admin.php');
  66. } else {
  67. include_once('public.php');
  68. }
  69. }
  70. */
  71.  
  72. //Inicjacja aplikacji
  73. try {
  74. AppCore::initializeApplication();
  75.  
  76. } catch (Error $err) {
  77. echo (Lang::getMessage('error').': '.Lang::getMessage($err->getMessage()).'<br/>');
  78. exit (Lang::getMessage('endofapplication'));
  79.  
  80.  
  81. }
  82.  
  83.  
  84.  
  85.  
  86.  
  87. ?>
  88.  
  89.  
  90.  
zend
Forum to nie parser, przecież pisze Ci jak byk że to na czym wykonujesz metodę Query nie jest obiektem, pewnie nawiązywanie połączenia się nie powiodło, albo wykonujesz zapytanie jeszcze przed nawiązaniem połączenia
neuroine
Mam bardzo podobny problem. Jakie jest rozwiązanie, żeby nie duplikować tematów ?

Pozdr
markkoo99
Witam ponownie , tu mam plik o nazwie catalog.php który wyglada następujaco:
  1. <?php
  2.  
  3. class Catalog extends Object {
  4.  
  5.  
  6.  
  7. public function getCategoryProductsNumber() {
  8. $sqlquery = 'select * from categories';
  9. if (!$result = AppCore::Query($sqlquery)) throw new Error('dberror');
  10. if (!$num = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
  11. return 0;
  12. }
  13. return current($num);
  14.  
  15. }
  16. }
  17. ?>

Nie wiem jak sobie z tym poradzić bo może coś źle robie.
zend
Wróżka wczoraj na urlop pojechała, także albo na nią poczekasz albo napisz coś więcej
markkoo99
Witam,
Wiec moja aplikacja wygląda w następujący sposób:
Katalog Aplication:
-apcore.php ( kod wyzej)

-comunication.php :
  1. <?php
  2.  
  3. /************************************
  4. *
  5. * Połaczenie inicializycjne do bazy danych
  6. *
  7. ************************************/
  8.  
  9. function DSNInit()
  10. {
  11. // Dołączenie obsługi klasy PEAR-DB
  12. require_once('DB.php');
  13.  
  14. return DB_TYPE . '://' . DB_USERNAME . ':' . DB_PASSWORD . '@' . DB_HOST . '/' . DB_NAME;
  15. }
  16.  
  17. ?>


-object.php :
  1. <?php
  2.  
  3. abstract class Object {
  4. /**#@+
  5.   * @access protected
  6.   */
  7. /**
  8.   * @var string Unikalny identyfikator obiektu (32 znaki).
  9.   */
  10. protected $_Id;
  11. /**
  12.   * @var string Identyfikator w?a?ciciela obiektu.
  13.   */
  14. protected $_Owner;
  15. /**
  16.   * @var string Typ obiektu (wszystkie typy przechowywane s? w bazie danych)
  17.   */
  18. protected $_Type;
  19. /**
  20.   * @var string Opis obiektu
  21.   */
  22. protected $_Desc;
  23.  
  24. protected $_LastModifyDate;
  25.  
  26. protected $_Active;
  27.  
  28. public function __construct () {}
  29.  
  30. public function setId($id){$this->_Id = $id;}
  31. }
  32. ?>
  33.  


- public.php
  1. <?php
  2. //Pobieranie struktury kategorii
  3. class Catalog extends Object {
  4.  
  5.  
  6.  
  7. public function getCategoryProductsNumber() {
  8. $sqlquery = 'select * from categories';
  9. if (!$result = AppCore::Query($sqlquery)) throw new Error('dberror');
  10. if (!$num = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
  11. return 0;
  12. }
  13. return current($num);
  14.  
  15. }
  16. }
  17.  
  18.  
  19. $catalog = new Catalog();
  20. $cat_struct = $catalog->getCategoryProductsNumber();
  21.  
  22. Catalog::getCategoryProductsNumber();
  23.  
  24.  
  25.  
  26. ?>



Katalog configuration:


- define.php
  1. <?php
  2. // Definiowanie parametrów konfiguracyjnych
  3.  
  4. define("DB_TYPE",'mysql');
  5. //Nazwa hosta na którym znajduję sie baza danych
  6. define("DB_HOST",'localhost');
  7. //Nazwa bazy danych
  8. define("DB_NAME",'xxx');
  9. //Nazwa użytkownika bazodanowego
  10. define("DB_USERNAME",'xxxx');
  11. //Hasło do bazy danych
  12. define("DB_PASSWORD",'xxxx');
  13. //Protokuł obsługujący połączenia
  14. define("DB_PROTOCOL", 'tcp');
  15.  
  16. ?>
  17.  


Katalog www:

-index.php

  1. <?php
  2.  
  3. define('APP_DIR', "../");
  4.  
  5. // G��wny plik aplikacji
  6. require_once(APP_DIR.'aplication/apcore.php');
  7.  
  8.  
  9. ?>
  10.  



Baza danych jest narazie prosta bo chce tylko wyświetlić te dane, a nie wiem gdzie popełniam błąd.
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.1.3.2
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 13 Cze 2010, 12:40
  7. -- Wersja serwera: 6.0.5
  8. -- Wersja PHP: 5.2.6
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11.  
  12. --
  13. -- Baza danych: `xxxx`
  14. --
  15.  
  16. -- --------------------------------------------------------
  17.  
  18. --
  19. -- Struktura tabeli dla `categories`
  20. --
  21.  
  22. CREATE TABLE IF NOT EXISTS `categories` (
  23. `ID_Cat` int(11) NOT NULL AUTO_INCREMENT,
  24. `ID_Parent` int(11) NOT NULL,
  25. `Name` varchar(40) NOT NULL,
  26. `Description` varchar(40) NOT NULL,
  27. PRIMARY KEY (`ID_Cat`)
  28. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
  29.  
  30. --
  31. -- Zrzut danych tabeli `categories`
  32. --
  33.  
  34. INSERT INTO `categories` (`ID_Cat`, `ID_Parent`, `Name`, `Description`) VALUES
  35. (1, 0, 'kat1', 'opis1'),
  36. (2, 0, 'kat2', 'opis2'),
  37. (3, 1, 'katpod', ''),
  38. (4, 2, 'podkat2', '');
  39.  
  40.  


To jest cała struktura mojej aplikacji.
zend
Ok, ale nie napisałeś najważniejszego, w czym tkwi problem? Dalej ten sam? Jeśli tak to najpierw się połącz z bazą albo sprawdź dane dosępowe. Możesz też wyrzucić ten blok try+catch+logowanie ze skryptu z pierwszego postu i zobaczyć efekt. Daj init_set('display_errors' , 'On'); w index'ie.
markkoo99
Problem mam ten sam:

Fatal error: Call to a member function Query() on a non-object in C:\WebSerwer\Apache2\Apache2\htdocs\sklep_inz\aplication\apcore.php on line 46


Wyrzuciłem to z o czym pisałeś z pliku apcore.php i dopisałem init_set('display_errors' , 'On'); w indexie.
Dalej ten sam błąd wyskakuje.
zend
Zmień kolejność ładowania plików, bo najpierw ładujesz plik, który już coś wykonuje, a następnie łączysz się z bazą
markkoo99
Witam ponownie,
zmieniłem kolejność i dalej wyskakuje ten sam błąd. Może coś źle robiee odnośnie wywołania zapytania do bazy?questionmark.gif moze cos jest nie tak z tworzeniem obiektu.
zend
  1. //wywal include_once 'public.php'; i wstaw niżej
  2. try
  3. {
  4. inicjacjaBazy();
  5. include_once 'public.php';
  6. }


Zadziała pod warunkiem że w innym miejscu nie zrobiłeś podobnego błędu
markkoo99
witam ponownie,
Zrobiłem jak napisałeś i tym razem wywaliło mi taki błąd:


Parse error: syntax error, unexpected T_REQUIRE_ONCE, expecting T_CATCH in C:\WebSerwer\Apache2\Apache2\htdocs\sklep_inz\aplication\apcore.php on line 22

W tej lini znajduje sie ta linijka:
require_once(APP_DIR.'/modules/catalog.php');
zend
Zapomniałeś prawdopodobnie catch dodać
  1. try{
  2.  
  3. }catch(Exception $e)
  4. {
  5. }
markkoo99
Zrobiłem tak jak pisałeś:
  1. try{
  2.  
  3. inicjacjaBazy();
  4.  
  5. include_once 'public.php';
  6.  
  7. }
  8. catch(Exception $e){
  9.  
  10. }

i teraz wywala mi taki błąd:

Fatal error: Call to undefined function inicjacjaBazy() in C:\WebSerwer\Apache2\Apache2\htdocs\sklep_inz\aplication\apcore.php on line 15
zend
To był pseudokod! Poza tym moim celem było pokazanie Ci gdzie masz załadować plik public.php, a nie całą procedurę łączenia z bazą, skoro ta była ok. Wykorzystaj od który podałeś w pierwszym poscie, ale public.php załaduj dopiero PO inicjajci bazy w bloku try {}
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.