le chemin relatif dans require_once ne fonctionne pas

103

J'ai la structure suivante

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

Le fichier include.php contient les éléments suivants

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';

et dans la page index.php j'avais inclus

require_once 'include/include.php';

Lorsque j'ouvre la page index.php, j'obtiens l'avertissement et l'erreur fatale suivants. Je ne comprends pas ce qui cause cette erreur. Quand j'ai donné le chemin absolu, cela fonctionne. Mais le chemin absolu n'est pas une bonne idée, je crois.

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

Merci d'avance

user525146
la source
Je fais habituellement Objective-C et j'essaie de mettre la main sur les scripts php et triste de voir que j'ai déjà perdu 2 heures à comprendre comment inclure correctement des fichiers en PHP. Les choses sont si faciles avec X-code.
rohan-patel
On rencontre souvent cette erreur, et pour la dépanner rapidement, suivez ces étapes: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Réponses:

216

Utilisation

__DIR__

pour obtenir le chemin actuel du script et cela devrait résoudre votre problème.

Alors:

require_once(__DIR__.'/../class/user.php');

Cela évitera les cas où vous pouvez exécuter un script PHP à partir d'un dossier différent et par conséquent, les chemins relatifs ne fonctionneront pas.

Edit: problème de slash corrigé

Raisen
la source
42
Fais attention! __DIR__est nouveau dans PHP 5.3. Si vous avez besoin de ce script pour s'exécuter sur des versions antérieures de PHP, vous devez utiliser à la dirname(__FILE__)place.
Charles
27
Notez que vous devez inclure manuellement la barre oblique finale après __DIR__. Donc: require_once(__DIR__.'/../class/user.php'); selon la documentation , la barre oblique de fin est omise sauf pour le répertoire racine.
Ariel Allon
9
Merci pour l'aide, mais je ne comprends toujours pas pourquoi __DIR__est nécessaire. La documentation PHP semble indiquer que PHP recherchera par défaut le répertoire du script actuel. Quelqu'un peut-il nous éclairer?
David
1
@David Je pense que cela est nécessaire lorsque vous importez un fichier de 2 endroits en même temps. Par exemple, vous avez un fichier avec require "../a.php". Si ce fichier est importé d'un autre fichier (x) dans dir1/dir2/x.phple fichier inclus sera dir1/a.php, mais si x est dans dir1/dir2/dir3/x.php, le fichier inclus sera dir1/dir2/a.php, etc. Ou est-ce que je me trompe?
José Ramón
1
Il existe maintenant une liste de contrôle de dépannage pour cette erreur fréquente ici: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew
17

pour php version 5.2.17 __DIR__ne fonctionnera pas, il ne fonctionnera qu'avec php 5.3

Mais pour les anciennes versions de php dirname(__FILE__)parfaitement

Par exemple, écrivez comme ceci

require_once dirname(__FILE__) . '/db_config.php';
Technologie mobile.
la source
1

Dans mon cas, cela ne fonctionne pas, même avec __DIR__ou getcwd()il continue de choisir le mauvais chemin, j'ai résolu en définissant un costant dans chaque fichier dont j'ai besoin avec le chemin de base absolu du projet:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

J'ai MAMP avec php 5.4.10 et ma hiérarchie de dossiers est basique:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....

linuxatico
la source
0

Je viens de tomber sur ce même problème, où tout fonctionnait bien, jusqu'au point où j'ai eu un inclut dans un autre inclut.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

Solution 1. (codage en dur indésirable du nom de mon dossier html public, mais cela fonctionne):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Solution 2. (commentaire indésirable ci-dessus à propos de DIR ne fonctionne que depuis php 5.3, mais cela fonctionne):

require_once __DIR__. '/../script/pdocrud.php';

Solution 3. (je ne vois aucun inconvénient, et cela fonctionne parfaitement dans mon php 5.3):

require_once dirname(__FILE__). '/../script/pdocrud.php';
hamish
la source