il percorso relativo in require_once non funziona


103

Ho la seguente struttura

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

Il file include.php ha quanto segue

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

e nella pagina index.php avevo incluso

require_once 'include/include.php';

Quando apro la pagina index.php ricevo il seguente avviso e l'errore irreversibile. Non capisco cosa causa questo errore. Quando ho dato il percorso assoluto funziona. Ma il percorso assoluto non è una buona idea credo.

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

Grazie in anticipo


Di solito sto facendo Objective-C e provo a mettere le mani sullo scripting php e triste da vedere ho già perso 2 ore per capire come includere correttamente i file in PHP. Le cose sono così facili con X-code.
rohan-patel

Ci si imbatte spesso in questo errore e per risolverlo rapidamente, seguire questi passaggi:
stackoverflow.com/a/36577021/2873507

Risposte:


216

Uso

__DIR__

per ottenere il percorso corrente dello script e questo dovrebbe risolvere il tuo problema.

Così:

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

Ciò eviterà casi in cui è possibile eseguire uno script PHP da una cartella diversa e quindi i percorsi relativi non funzioneranno.

Modifica: problema di barra risolto


42
Attento! __DIR__è nuovo in PHP 5.3. Se hai bisogno di questo script per funzionare su versioni precedenti di PHP, dovresti usare dirname(__FILE__)invece.
Charles

27
Nota che dovresti includere manualmente la barra finale dopo __DIR__. Quindi: require_once(__DIR__.'/../class/user.php'); per la documentazione , la barra finale viene omessa tranne che per la directory principale.
Ariel Allon

9
Grazie per l'aiuto, ma ancora non capisco perché __DIR__sia necessario. I documenti PHP sembrano dire che PHP cercherà la directory dello script corrente per impostazione predefinita. Qualcuno può far luce?
David

1
@David, penso che questo sia necessario quando importi un file da 2 posti contemporaneamente. Ad esempio, hai un file con estensione require "../a.php". Se questo file viene importato da un altro file (x) nel dir1/dir2/x.phpfile incluso sarà dir1/a.php, ma se x è in dir1/dir2/dir3/x.php, il file incluso sarà dir1/dir2/a.php, ecc. O mi sbaglio?
José Ramón

1
V'è ora un elenco di diagnostica per questo frequente errore qui: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

per php la versione 5.2.17 __DIR__non funzionerà funziona solo con php 5.3

Ma per la versione precedente di php dirname(__FILE__)perfettamente

Ad esempio, scrivi in ​​questo modo

require_once dirname(__FILE__) . '/db_config.php';

1

Nel mio caso non funziona, anche con __DIR__o getcwd()continua a scegliere il percorso sbagliato, ho risolto definendo una costante in ogni file di cui ho bisogno con il percorso di base assoluto del progetto:

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

Ho MAMP con php 5.4.10 e la mia gerarchia di cartelle è basilare:

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

....


0

Mi sono appena imbattuto in questo stesso problema, dove funzionava tutto bene, fino al punto in cui ho avuto un include all'interno di un altro include.

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

Soluzione 1. (hardcoding indesiderato del nome della mia cartella html pubblica, ma funziona):

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

Soluzione 2. (commento indesiderato sopra su DIR che funziona solo da php 5.3, ma funziona):

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

Soluzione 3. (Non riesco a vedere alcun aspetto negativo e funziona perfettamente nel mio php 5.3):

require_once dirname(__FILE__). '/../script/pdocrud.php';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.