Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]dot dot slash problem
Forum PHP.pl > Forum > Przedszkole
xix
Oto proste drzewo plikow
../a.php
../b.php
../f/c.php
Jak widac pliki a i b sa na tym samym poziomie, a plik c jest w folderze f.
Z tego co widze, by sie odwolac do pliku a z pliku b, to w pliku b nalezy zamiescic funkcje include('./a.php').
Aby odwolac sie do pliku a z pliku c, to w pliku c nalezy zamiescic funkcje include('../a.php'). Plik c odwoluje sie rowniez do innych plikow i tu pojawiaja sie bledy w ich znalezieniu (sciezki probowalem wpisywac w roznych konfiguracjach i nic nie wychodzi).

Pytanie:
Czy istnieje jakis sposob na funkcje podobna do ponizszej, ktora ulatwilaby poruszanie sie miedzy plikami:

wazny_folder(jest tam, gdzie znajduje sie plik a);
zastosowanie:
inlude('wazny_folder('./f/c.php')');
piotrooo89
nie bardzo rozumiem problemu. chcesz z pliku c odwołać się do plików w folderze wazny_folder.

jeśli tak to w c.php wpisz:
  1. <?php
  2. include ('../wazny_folder/plik.php');
  3. ?>


ale jak mówię nie wiem czy o to Ci chodzi.
xix
Wyjasnie moze bardziej w inny sposob o co mi chodzi.
Oto inne drzewo plikow:
/a.php
/1/b.php
/2/c.php
/d.php

1 i 2 to foldery plikow "b.php" i "c.php".
Plik "c.php" jest skladnikiem pliku "a.php" ("c.php" zawiera sie w "a.php") i jednoczesnie rowniez jest on czescia pliku "b.php".
Jezeli zrobie odwolanie do pliku "d.php" z pliku "c.php" poprzez "../", to plik "d.php" nie zostanie znaleziony w pliku "a.php" lub "b.php", bo jest on widziany od strony wlasnie tych plikow "a.php" i "b.php", a nie od strony pliku "c.php", mimo ze tam znajduje sie do niego jedyny odnosnik.

Oczywiscie u mnie sprawa jest znacznie bardziej skomplikowana, a nie chce mnozyc plikow, ktore beda wygladaly identycznie, procz zawartych w nich odnosnikow.
Jak to rozwiazac?
Pomyslalem, ze moze mozna ustalic jakas rozna kotwice/zakladke dla plikow "a.php" i "b.php".
Ja tego nie wiem, ale moze jednak jest lepsze odwolanie, niz "../" - na przyklad "%/", gdzie % to folder glowny (odsylanie do tego folderu niezalezne od glebokosci pliku).
Eagle
Średnio to wszystko rozumiem ale może zobacz set_include_path()
Crozin
Ewentualnie możesz stosować ścieżki bezwzględne zamiast względnych.
xix
Nie rozumiem czemu zmieniac globalnie plik php.ini, jezeli zmiany potrzebuje tylko lokalnej dla jednego pliku. Czy nie da sie tego prosciej zrobic? Szukalem z reszta po necie i po ksiazkach i wzoru niestety nie znalazlem jak takie cos przeprowadzic.
Musze zastosowac sciezki bezwzgledne, bo plikow mam duzo i sa przenoszone z miejsca na miejsce.

Aby jeszcze rozjasnic jaki jest problem, do zamieszczonego wczesniej drzewa katalogow dodam zawartosc plikow.

/a.php
Zawartosc pliku a.php z folderu glownego:
Kod
<?php
     include('./2/c.php');
     ?>
     widze plik a<br />


/1/b.php
Zawartosc pliku b.php z folderu 1 umieszczonego w folderze glownym:
Kod
<?php
     include('../2/c.php');
     ?>
     widze plik b<br />


/2/c.php
Zawartosc pliku c.php z folderu 2 umieszczonego w folderze glownym:
Kod
<?php
     include('./d.php');
     ?>
     widze plik c<br />


/d.php
Zawartosc pliku d.php z folderu glownego:
Kod
<?php
     echo "widze plik d<br />";
     ?>


po wyswietleniu pliku a.php w przegladarce otrzymam wynik:
Cytat
widze plik d
widze plik c
widze plik a


po wyswietleniu pliku b.php w przegladarcze otrzymam wynik:
Cytat
Warning: main(./d.php): failed to open stream: No such file or directory in...
Warning: main(): Failed opening...
widze plik c
widze plik b


Jezeli zmienie w pliku "c.php" sciezke "include('./d.php');" na "include('../d.php');"
to blad nie pojawia sie juz przy wyswietleniu pliku "b.php", ale pojawia sie przy wyswietleniu pliku "a.php".
Sprawa by byla rozwiazana, jesli cos by wysylalo do folderu glownego na przyklad w taki sposob:
"include('%/d.php');"
% oznacza - niezaleznie gdzie jestes szukaj plik zaczynajac od folderu glownego / folderu zakladki / folderu kotwicy...
erix
Zrób sobie stałą, która zawiera bezwzględną ścieżkę do całego skryptu, np.
  1. <?php
  2. define('CWD', '/home/user/public_html/katalog/');
  3.  
  4. // gdzies dalej...
  5.  
  6. reqire CWD.'/lib/skrypt.php';
  7. ?>


Stałą możesz sobie deklarować w jakimś konkretnym pliku i go dołączać. Najpewniejszy sposób.
xix
Jest to jakies rozwiazanie, chociaz na pewno ladniejsze bylo by z jakims % na przyklad. Niestety "../" wysyla tylko folder wyzej, wiec fajnie by bylo, gdyby jeszcze istnialo cos typu "%/" wysylajace do glownego folderu. Juz jeden plik ze stalymi mam, wiec tam doloze ta nowa.
W praktyce, do powyzszego drzewka dodalem jeszcze jeden plik "e.php" z ponizsza zawartoscia:
Kod
<?php
      define('KOTWICA','C:\usr\apache\httpd\html/');
      ?>

do pliku "a.php" dodalem nowa linie:
Kod
<?php
      incude('./e.php');
      include('./2/c.php');
      ?>
      widze plik a

do pliku "b.php" dodalem nowa linie:
Kod
<?php
      incude('../e.php');
      include('../2/c.php');
      ?>
      widze plik b

a plik "c.php" zostal zmieniony tak:
Kod
<?php
      include KOTWICA.'d.php';
      ?>
      widze plik c


Plik "d.php" nie ulegl zmianie. Uwaga na ilosc kropek przy linkach!
erix
Cytat
Jest to jakies rozwiazanie, chociaz na pewno ladniejsze bylo by z jakims % na przyklad. Niestety "../" wysyla tylko folder wyzej, wiec fajnie by bylo, gdyby jeszcze istnialo cos typu "%/" wysylajace do glownego folderu.

Ładniejsze tak, ale nie byłoby już tak wydajne i czytelne, ponieważ wczytać stałą jest dużo szybciej niż obrabiać łańcuch w poszukiwaniu wybranego przez Ciebie tekstu. Poza tym, inny programista musiałby się domyślać, o co chodzi. winksmiley.jpg

Poza tym, musiałbyś - w pewnym sensie - wynaleźć koło na nowo i pisać drugi raz coś, co tak naprawdę istnieje - stała + nazwa pliku.
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.