Mam następującą strukturę
otsg
> class
> authentication.php
> database.php
> user.php
> include
> config.inc.php
> encryption.php
> include.php
> session.php
> index.php
> registration.php
include.php ma następujący plik
ini_set('display_errors', 1);
error_reporting(E_ALL);
ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';
i na stronie index.php, którą zamieściłem
require_once 'include/include.php';
Kiedy otwieram stronę index.php, otrzymuję następujące ostrzeżenie i błąd krytyczny. Nie rozumiem, co powoduje ten błąd. Kiedy podałem absolutną ścieżkę, to działa. Ale absolutna ścieżka nie jest dobrym pomysłem.
Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9
Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9
Z góry dziękuję
php
warnings
fatal-error
require-once
user525146
źródło
źródło
Odpowiedzi:
Posługiwać się
aby uzyskać aktualną ścieżkę do skryptu, co powinno rozwiązać problem.
Więc:
Zapobiegnie to przypadkom, w których można uruchomić skrypt PHP z innego folderu i dlatego ścieżki pokrewne nie będą działać.
Edycja: naprawiono problem z ukośnikiem
źródło
__DIR__
jest nowy w PHP 5.3. Jeśli potrzebujesz tego skryptu do działania we wcześniejszych wersjach PHP, powinieneś użyćdirname(__FILE__)
zamiast tego.__DIR__
. Tak więc: zgodnierequire_once(__DIR__.'/../class/user.php');
z dokumentacją końcowy ukośnik jest pomijany, z wyjątkiem katalogu głównego.__DIR__
jest to konieczne. Dokumentacja PHP wydaje się mówić, że PHP domyślnie przeszuka katalog bieżącego skryptu. Czy ktoś może rzucić nieco światła?require "../a.php"
. Jeśli ten plik jest importowany z innego pliku (x) wdir1/dir2/x.php
dołączonym pliku będziedir1/a.php
, ale jeśli x jest wdir1/dir2/dir3/x.php
, dołączony plik będziedir1/dir2/a.php
itd. A może się mylę?dla php w wersji 5.2.17
__DIR__
nie będzie działać, będzie działać tylko z php 5.3Ale dla starszej wersji php
dirname(__FILE__)
doskonaleNa przykład napisz w ten sposób
źródło
W moim przypadku to nie działa, nawet z
__DIR__
lubgetcwd()
ciągle wybiera niewłaściwą ścieżkę, rozwiązałem, definiując koszt w każdym potrzebnym pliku z bezwzględną ścieżką bazową projektu:Mam MAMP z php 5.4.10 i moja hierarchia folderów jest podstawowa:
....
źródło
Właśnie natknąłem się na ten sam problem, w którym wszystko działało dobrze, aż do momentu, gdy miałem zawarcie w innym dołączeniu.
Rozwiązanie 1. (niepożądane zakodowanie nazwy mojego publicznego folderu html, ale działa):
Rozwiązanie 2. (niepożądany komentarz powyżej o DIR działającym tylko od php 5.3, ale działa):
Rozwiązanie 3. (nie widzę żadnych wad i działa idealnie w moim php 5.3):
źródło