Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z set_include_path, pętla przekierowań
Forum PHP.pl > Forum > PHP
adamantd
Witam,

przerzuciłem sobie stronkę z WebServa na xamppa i coś się zepsuło, a mówiąc ściślej pojawia się błąd w przeglądarce

  1. "Ta strona internetowa zawiera pętlę przekierowań"


a w pasku adresu wywala mi takie coś:

  1. http://localhost/newproject/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/
  2. SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/
  3. SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/SERVER_ADRESSerror/
  4. SERVER_ADRESSerror/


w pliku z autoloudem mam ustawienia ścieżek set_include_path jedna pod drugą i na WebServie śmiagało a teraz __autoload albo nie znajduje plików albo pojawia się właśnie taka pętla przekierowań (nie znajduje plików jak zamiast set_include_path() zrobiłem sobie kilka include_once z różnymi ścieżkami wpisanymi na sztywno)

inne projekty w których nie używam set_include_path działają bez problemów po przeniesieniu na xamppa. Ścieżki ustawiam podręcznikowo jak w manualu przykład poniżej:

  1.  
  2. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/library');
  3.  


zeszukałem się i nakombinowałem łącznie z ponowną instalacją xamppa i nie mogę tego rozwiązać
co może być powodem?
freemp3
Wydaje mi się, że problem jest w obsłudze błędów. Podczas obsługi błędu pojawia się inny błąd i następują kolejne przekierowania tyle, że zamiast przekierować na odpowiedni adres doklejane są kolejne człony.

Proponuje żebyś zastosował metodę gumowej kaczuszki. Możesz też co kilka linijek dodawać echo z jakimś tekstem i bezpośrednio za tym exit. Do momentu, w którym tekst będzie się wyświetlał aplikacja działa. Proponuje też w jakiś kluczowych momentach wyświetlać wartości zmiennych i sprawdzać czy faktycznie są takie jak powinny.
adamantd
@freemp3
"metoda kaczuszki" powiadasz smile.gif nawet nie wiedziałem, że tak się na to mówi -ale takie testy zrobiłem w pierwszej kolejności, linijka za linijką
ten projekt jest oparto o MVC w najbardziej standardowy sposób i problem zaczyna się już w głównym pliku index.php, gdzie najpierw includuję plik z set_include_path kierującym do wielu folderów oraz autoloadem, później tworzę obiekt router i przekazuję go do dispatchera. W tym miejscu przed przekazaniem do dispatchera obiektu router wrzucam die($router->controller()) celem sprawdzenia co mi zwróci i tu oczywiście zamiast pętli przekierowań wywala błąd, że właściwość ta nie została zdefiniowana, usuwam więc moje testowe die($router->controller()) i robię to samo w klasie dispatcher przed includem controllera dla danego widoku i tam też wywala błąd, że właściwość jest niezdefiniowana. Wychodzi na to, że set_include_path po prostu nie chcą z jakichś przyczyn działać na xamppie.... i pytanie dlaczego, czy muszę zmienić coś w konfiguracji xamppa czy użyć innego sposobu niż set_include_path? np w autoloudzie przeszukiwać wszystkie ścieżki po kolei nie wyświetlając błędów

  1.  
  2. function __autoload($name)
  3. {
  4. @include_once('sciezka1/'.$name.".php");
  5. @include_once('sciezka2/'.$name.".php");
  6. @include_once('sciezka3/'.$name.".php");
  7. @include_once('sciezka4/'.$name.".php");
  8. @include_once('sciezka5/'.$name.".php");
  9. @include_once('sciezka6/'.$name.".php");
  10. }
  11.  


taki sposób wydaje mi się mniej profesjonalny niż set_include_path smile.gif
freemp3
set_include_path na pewno działa na xampp. Sprawdzałeś co zwraca get_include_path? Ścieżki, które się tam znajdują są poprawne?
adamantd
Właśnie przed chwilką sprawdziłem set_include_path również na xamppie i działa rzeczywiście bez problemów a w poprzednim poście walnąłem błęda bo wyświetlając testowym die() odwoływałem się do prywatnej właściwości $router->controller, dlatego nic mi nie zwracała po za błędem ale teraz odwołuję się prawidłowo do metody getController() i zwraca taką wartość jak ta która jest w zapętleniu wyświetlona w pasku URL czyli: SERVER_ADRESSerror

a co do get_include_path to ... ciekawa rzecz, zaraz napiszę moje spostrzeżenie bo coś mi tu dziwnego zwraca, niekończący się ciąg znaków z.w.

chyba wszystko z nim jest ok przed wszelkimi ustawieniami w pliku z autoloadem, przed jakimikolwiek set_include_path -get_include_path zwraca

  1. .;C:\xampp\php\PEAR


po ustawieniach set_include_path -get_include_path zwraca

  1.  
  2. .;C:\xampp\php\PEAR;core/main;core/drivers;core/helpers;core/library;core/i18n;core/models;application/controllers;application/models;application/views
  3.  


dodam jeszcze, że sprawdziłem to samo na WebServie i get_include_path w tych samych miejscach zwraca dokładnie to samo po za początkiem, tam jest

  1. .;C:\php\pear


zauważyłem, że w xamppie folder pear jest podpisany z małych liter kiedy w ścieżce get_include_path jest z dużych, wpisałem zatem w ustawieniu set_include_path na sztywno z małych liter i nie pomogło a później jeszcze w php.ini zmieniłem ścieżkę include_path na małe litery i też nie pomaga, dalej pętla przekierowań
freemp3
Wygląda ok. Pytanie tylko, czy są one poprawne względem pliku index.php? Jak rozumiem struktura plików w głównym katalogu wygląda następująco:
Kod
index.php
application
core
helpers
i18n

Z jakiego frameworka korzystasz? To jest Twoje dzieło czy coś gotowego?
Porównywałeś jak to wyglądało na poprzednim serwerze? Sprawdzałeś co faktycznie trafia do instrukcji include?
adamantd
Moje dzieło, bez frameworka bo to mały projekt będzie
mniej więcej taki rozkład

  1.  
  2. projekt/
  3. application/
  4. controllers/
  5. library/
  6. media/
  7. models/
  8. views/
  9. core/
  10. config/
  11. main/
  12. drivers/
  13. helpers/
  14. i18n/
  15. library/
  16. init.php //tutaj mam autoloada oraz ustawienia ścieżek
  17. index.php
  18. .htaccess
  19.  
  20.  


jeszcze pare innych folderów

Cały folder główny tego projektu (działającego), w sensie zrobiłem pierwszy controller i pierwszy widok na WebServie działa, po skopiowaniu całości tak jak jest na xampp pojawiły się problemy, które opisuję.

Najdziwniejsze w tym wszystkim jest to, że przed chwilą zrobiłem sobie jak już pisałem kilka postów wyżej w folderze htdocs inny folder testowy w którym utworzyłem sobie taki przykładowy zestaw katalogów i plików

  1.  
  2. test/
  3. folder/
  4. plik.html
  5. index.php
  6.  
  7.  
  8. /////////////////
  9. -----plik.html----
  10.  
  11. siemanko sprawdzam czy działa html
  12.  
  13. ----plik index.php-----
  14.  
  15. <?php
  16. include_once('plik.html');
  17. //////tu oczywiście nie znajduje pliku plik.html
  18.  
  19. -----plik index.php po ustawieniu ścieżki------
  20.  
  21. <?php
  22. set_include_path(get_include_path() . PATH_SEPARATOR . 'folder');
  23. include_once('plik.html');
  24. ///////tutaj wszystko działa i wyświetla mi mój tekst w przeglądarce
  25.  
  26.  


Porobie po obiedzie z milion testów w końcu musi się wyjaśnić, przecież tutaj nie może to nie działać do chol..... jasnej
jak skończe napisze jaki rezultat

No nie do rozkminienia bez jaj biggrin.gif

Jeszcze raz cały folder z moimi plikami odpaliłem na WebServie i działa, skopiowałem cały ten folder z projektem tak jak jest w całości i wkleiłem do htdocs w xampp i pętla przekierowań, czy ktoś to rozumie?

@edit:

Po bardzo ciężkim bilionie testów problem rozwiązany choć jego rozwiązanie kompletnie nie zrozumiałe....

plik z ustawieniami ścieżek set_include_path() oraz z autoloudem:

  1.  
  2. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/main');
  3. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/drivers');
  4. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/helpers');
  5. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/library');
  6. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/models');
  7. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/controllers');
  8. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/models');
  9. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/views');
  10.  
  11. function __autoload($name)
  12. {
  13. include_once($name.".php");
  14. }
  15.  


powyższy przykład to plik includowany do głównego pliku index i wszystko idealnie działa na WebServ oraz na serwerze zdalnym, nie działa za to na xampp i nie ma możliwości, żeby zadziałało, nie znajduje plików z klasami przez co nie tworzy ani nie rejestruje obiektów klass

Poniższy przykład działa na trzech serwerac:h WebServ, xampp i serwer zdalny (przynajmniej mój)

  1.  
  2. set_include_path('core/main');
  3. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/drivers');
  4. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/helpers');
  5. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/library');
  6. set_include_path(get_include_path() . PATH_SEPARATOR . 'core/models');
  7. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/controllers');
  8. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/models');
  9. set_include_path(get_include_path() . PATH_SEPARATOR . 'application/views');
  10.  
  11. function __autoload($name)
  12. {
  13. include_once($name.".php");
  14. }
  15.  


Dodam, że w php.ini w xampp jest definicja include_path=".;C:\xampp\php\PEAR"
echo get_include_path(); przed ustawieniem ścieżek wyświetla tak jak w php.ini .;C:\xampp\php\PEAR

a w WebServie NIE MA (jest zakomentowana)
echo get_include_path(); wyświetla .;C:\php\pear

Czy ktoś potrafi wytłumaczyć to zjawisko? Dlaczego teraz wszystko działa a wcześniej nie? Bo trochę mam wątpliwości czy przerzucać się na xampp (bo jest szybszy i ma min. nowsze phpmyadmin) skoro znowu trafię na jakąś bzdurę i będę ją rozkminiał cały dzień....
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.