Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ścieżka względna dołączonego pliku
Forum PHP.pl > Forum > PHP
WebCM
Jak uzyskać ścieżkę względną dołączonego pliku w najprostszy sposób?

  1. dirname(__FILE__)

To nie jest ścieżka względna, tylko absolutna: C:\xampp\katalog\skryptu

Nie ma go także w tablicy $_SERVER, bo ona jest tworzona przed wywołaniem include().

Dla tych, co nie rozumieją:

  1. include 'katalog/skryptu/plik.php';
  2.  
  3. //W pliku katalog/skryptu/plik.php chcę uzyskać ścieżkę: katalog/skryptu/

Po co mi to? Aby wstawić do kodu HTML, np. <script src="">, a tam musi być ścieżka typu katalog/skryptu/
krzotr
Może coś takiego ?

  1. <?php
  2.  
  3. $plik = '/home/test/abc.php';
  4.  
  5. $plik2 = '/home/test/jakis/katalog/plik.php';
  6.  
  7. echo substr( $plik2, strlen( dirname( $plik ) ) + 1 ); // jakis/katalog/plik.php


Zobacz jeszcze get_included_files
WebCM
Wykombinowałem na szybko coś takiego - działa tak samo jak z get_included_files:
  1. $dir1 = getcwd(); //katalog skryptu głównego
  2. $dir2 = __DIR__.'/'; //katalog skryptu obecnego + ukośnik
  3. $dir = str_replace('\\', '/', substr($dir2,strlen($dir1)+1));
Jeżeli chcecie ten kod wykorzystać, przetestujcie go, czy działa dla wszystkich możliwych przypadków.

Czy gra warta świeczki? Czy po prostu zabronić użytkownikom skryptu zmiany nazwy katalogu i kazać umieścić go tam, gdzie jest index.php czy tam inny skrypt (zazwyczaj w folderze głównym)? Wierzcie, że nie wszyscy umieją podać właściwą ścieżkę ręcznie.
darko
Cytat(WebCM @ 26.04.2011, 01:02:09 ) *
Czy po prostu zabronić użytkownikom skryptu zmiany nazwy katalogu i kazać umieścić go tam, gdzie jest index.php czy tam inny skrypt (zazwyczaj w folderze głównym)? Wierzcie, że nie wszyscy umieją podać właściwą ścieżkę ręcznie.

Ustaw jakąś domyślną ścieżkę z możliwością jej zmiany. Co do kodu, to sprawdzałem na linuksie i nie działa, po prostu wyświetla pustą stronę, a nie prościej zrobić tak:
  1. echo substr(dirname($_SERVER['SCRIPT_NAME']) . '/', 1, strlen(dirname($_SERVER['SCRIPT_NAME']) . '/'));

?
// edit
jeszcze krócej:
  1. echo substr(dirname($_SERVER['SCRIPT_NAME']), 1, strlen(dirname($_SERVER['SCRIPT_NAME']))) . '/';
WebCM
Cytat
sprawdzałem na linuksie i nie działa, po prostu wyświetla pustą stronę
A użyłeś instrukcji echo bądź var_dump($dir)? Zrób tak:
  1. //Plik główny
  2. include 'katalog/innyplik.php';
  3.  
  4. //W pliku katalog/innyplik.php
  5. $dir1 = getcwd();
  6. $dir2 = __DIR__.'/';
  7. var_dump(str_replace('\\', '/', substr($dir2,strlen($dir1)+1)));

Nie zawsze warto polegać na tablicy $_SERVER. Niektóre serwery nie przekazują wszystkich danych. Użytkownik i tak będzie musiał podać ścieżkę do pliku, który dołącza. Przykład:
  1. //Bibliotekę (skrypt) trzeba dołączyć
  2. include 'sciezka/do/pliku.php';
  3. funkcja();
  4.  
  5. //Czy da się konkretnie uzyskać to, co użytkownik wpisał do include, czyli: sciezka/do/pliku.php?
  6. //Raczej nie, bo include nie jest funkcją, tylko instrukcją
  7. //Można i tak:
  8. include 'sciezka/do/pliku.php';
  9. funkcja('sciezka/do/');
darko
Cytat(WebCM @ 26.04.2011, 12:30:16 ) *
A użyłeś instrukcji echo bądź var_dump($dir)?

Tak, var_dump($dir); zwróciło:
string(0) "" gdybym nie sprawdził, nie napisałbym, że sprawdziłem. Nic dziwnego, na linuksie nie ma ścieżek windowsowych (\\).
WebCM
Jeżeli oba pliki są w tym samym katalogu, pojawi się dokładnie string(0) "". Zauważ, że zamieniam \ na / po to, by po stronie klienta ścieżki były prawidłowe. Jeżeli nie będzie \ to str_relace() pozostawi ścieżkę bez zmian.
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.