Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z singletonem
Forum PHP.pl > Forum > Przedszkole
zoska2801
Witam wszystkich. Mam takie pytanie. Z góry przestrzegam, żeby nie jeść i nie pić podczas czytania tego bo można się zadławić ze śmiechu facepalmxd.gif Bo domyślam się, że pytanie może być banalne oneeyedsmiley02.png
Dlaczego użycie tej klasy w jednym pliku działa, a po rozdzieleniu kodu klasy do innego pliku zwraca błąd Fatal error: Class 'PDOConnection' not found

klasy.php
  1. class PDOConnection {
  2.  
  3.  
  4. protected static $_instance = null;
  5.  
  6. public static function instance() {
  7.  
  8. if ( !isset( self::$_instance ) ) {
  9.  
  10. self::$_instance = new PDOConnection();
  11.  
  12. }
  13.  
  14. return self::$_instance;
  15. }
  16.  
  17.  
  18. protected function __construct() {}
  19.  
  20. function __destruct(){}
  21.  
  22.  
  23. public function getConnection($dsn, $username, $password) {
  24.  
  25. $conn = null;
  26. try {
  27.  
  28. $conn = new \PDO($dsn, $username, $password);
  29.  
  30.  
  31. $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
  32.  
  33. return $conn;
  34.  
  35. } catch (PDOException $e) {
  36.  
  37.  
  38. throw $e;
  39.  
  40. }
  41. catch(Exception $e) {
  42.  
  43.  
  44. throw $e;
  45.  
  46. }
  47. }
  48.  
  49.  
  50. public function __clone()
  51. {
  52. return false;
  53. }
  54. public function __wakeup()
  55. {
  56. return false;
  57. }
  58. }


index.php (ten sam katalog)
  1. require 'klasy.php';
  2. $pdo = PDOConnection::instance();
  3. $conn = $pdo->getConnection( 'dns', 'user', 'pass' );
  4.  
  5. $results = $conn->query("SELECT id,opis FROM tabela");
  6. echo '<ul>';
  7. foreach($results as $row)
  8. {
  9. echo '<li>'.$row['id'].': '.$row['opis'].'</li>';
  10. }
  11.  
  12. echo '</ul>';
KsaR
Hm.
Bo includujesz a.php zamiast klasy.php
--
Swoja droga, tu inny, z ksiazki i tez pdo:

  1. <?php
  2. // Klasa Database reprezentuje globalne połączenie z bazą danych
  3. class Database extends PDO {
  4. // Zmienna statyczna do przechowywania jedynego egzemplarza klasy
  5. private static $_instance = null;
  6.  
  7. // Zdefiniowanie konstruktora jako prywatnego, aby uniemożliwić tworzenie wielu obiektów
  8. private function __construct()
  9. {
  10. // Wywołanie konstruktora klasy PDO
  11. parent::__construct(APP_DB_DSN, APP_DB_USER, APP_DB_PASSWORD);
  12. }
  13.  
  14. // Metoda dostępu do jedynego egzemplarza klasy
  15. public static function getInstance()
  16. {
  17. if (!(self::$_instance instanceof Database)) {
  18. self::$_instance = new Database();
  19. }
  20.  
  21. return self::$_instance;
  22. }
  23. }
  24. ?>

tongue.gif
zoska2801
Sorry za te require 'a.php'; to miało być require 'klasy.php' facepalmxd.gif
Co nie zmienia faktu, że błąd ten sam wyskakuje
KsaR
Cytat(zoska2801 @ 28.09.2015, 06:29:14 ) *
Sorry za te require 'a.php'; to miało być require 'klasy.php' facepalmxd.gif
Co nie zmienia faktu, że błąd ten sam wyskakuje

Wywolaj co ci pokaze:

  1. print_r(glob('*.php'));

Najlepiej na poczatku pliku index.php
+ pokaz te fragmenty z pliku ktory dziala, i ktory nie dziala.
Include itd.
zoska2801
Tylko to się wyświetla
  1. Array ( [0] => index.php [1] => klasy.php ) Fatal error: Class 'PDOConnection' not found in /www/klasy/index.php on line 4
KsaR
Cytat(zoska2801 @ 28.09.2015, 06:37:33 ) *
Tylko to się wyświetla
  1. Array ( [0] => index.php [1] => klasy.php ) Fatal error: Class 'PDOConnection' not found in /www/klasy/index.php on line 4

A w tym drugim pliku?
Bo jak sama widzisz masz 2 pliki php w folderze:

1. index.php
2. klasy.php

Czyli jesli zrobisz w index.php
include 'klasy.php';
To bedzie w nim dzialac oczywiscie bo jest tam plik klasy.php
Ale jak widac innych plikow nie ma.
Sprawdz dokladnie w jakiej sciezce jest drugi plik, nastepnie sprawdz na FTP czy co tam masz czy faktycznie jest tam ten plik. (Bo nie ma w tym folderze gdzie index.php, klasy.php)
A nastepnie popraw sciezke wskazujac na odpowiedni plik w tym drugim (na klasy.php).

Gdybys miala problem to pokaz cala strukture, gdzie jest plik ktory nie dziala, oraz gdzie klasy.php
Wraz z nazwami plikow tymi co wyzej oraz z nazwami folderów.
zoska2801
A więc tak.

Plik klasy.php
  1. class PDOConnection {
  2.  
  3.  
  4. protected static $_instance = null;
  5.  
  6. public static function instance() {
  7.  
  8. if ( !isset( self::$_instance ) ) {
  9.  
  10. self::$_instance = new PDOConnection();
  11.  
  12. }
  13.  
  14. return self::$_instance;
  15. }
  16.  
  17.  
  18. protected function __construct() {}
  19.  
  20. function __destruct(){}
  21.  
  22.  
  23. public function getConnection($dsn, $username, $password) {
  24.  
  25. $conn = null;
  26. try {
  27.  
  28. $conn = new \PDO($dsn, $username, $password);
  29.  
  30.  
  31. $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
  32.  
  33. return $conn;
  34.  
  35. } catch (PDOException $e) {
  36.  
  37.  
  38. throw $e;
  39.  
  40. }
  41. catch(Exception $e) {
  42.  
  43.  
  44. throw $e;
  45.  
  46. }
  47. }
  48.  
  49.  
  50. public function __clone()
  51. {
  52. return false;
  53. }
  54. public function __wakeup()
  55. {
  56. return false;
  57. }
  58. }


Plik index.php
  1. print_r(glob('*.php'));
  2. require 'klasy.php';
  3. $pdo = PDOConnection::instance();
  4. $conn = $pdo->getConnection( 'dns', 'user', 'pass' );
  5.  
  6. $results = $conn->query("SELECT id,opis FROM tabela");
  7. echo '<ul>';
  8. foreach($results as $row)
  9. {
  10. echo '<li>'.$row['id'].': '.$row['opis'].'</li>';
  11. }
  12.  
  13. echo '</ul>';


Oba pliki znajdują się w katalogu /www/klasy/
W tym katalogu są wyłącznie te 2 pliki klasy.php oraz index.php
KsaR
Dobra zle odczytalem bo nie mysle(nie spalem tongue.gif)
Do samego testu, sprobuj tak:

  1. $glob=glob('*.php');
  2. require $glob[1];

O ile w ta chwile nie zmienila sie ilosc plikow w folderze.
Jesli dziala > a powinno.
To zrobilas literowke w nazwie.
Jesli nie to cos z sciezka.

To serwer zwykly? Czy na jakims programie?..
--

PS. Spróbuj też tak wrazie czego żeby postów nie bić i czasu nie tracić:

  1. require './klasy.php';
zoska2801
Ooooo OK. Jezu jak mi wstyd ohno-smiley.gif
Już wiem dlaczego to mi nie działało. Się okazało, że przez moje niedopatrzenie w edytorze miałam wszystko tak jak pokazywałam tutaj. A na serwer wrzucałam inne pliki facepalmxd.gif
Niech to będzie dla mnie nauczka, by zmieniać nazwy plików jak wrpowadza się w nich jakieś zmiany.
Bardzo dziękuje tak czy tak za pomoc smile.gif
Post można wyrzucić już do kosza
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.