web-dev-qa-db-fra.com

le chemin relatif dans require_once ne fonctionne pas

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

Quand j'ouvre la page index.php j'obtiens l'avertissement suivant et l'erreur fatale. 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

96
user525146

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 autre dossier et par conséquent les chemins relatifs ne fonctionneront pas.

Edit: problème de barre oblique corrigé

203
Raisen

pour php version 5.2.17 __ [~ # ~] dir [~ # ~] __ ne fonctionnera pas il ne fera que fonctionne avec php 5.3

Mais pour les anciennes versions de php dirname (__ (= [~ # ~] fichier [~ # ~] __) parfaitement

Par exemple, écris comme ça

require_once dirname (__ [~ # ~] fichier [~ # ~] __). '/db_config.php';

17
Mobile Tech.

Dans mon cas, cela ne fonctionne pas, même avec __DIR__ Ou getcwd(), il continue de choisir le mauvais chemin. J'ai résolu ce problème en définissant un coûtant dans chaque fichier dont j'ai besoin avec le chemin de base absolu du fichier. 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 basilaire:

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

....

1
linuxatico

Je viens de rencontrer le même problème, où tout fonctionnait bien, jusqu'au point où j'avais un inclus dans un autre.

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 de mon nom de dossier html public, mais cela fonctionne):

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

Solution 2. (commentaire non désiré ci-dessus à propos de DIR ne fonctionnant 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';
0
hamish