la ruta relativa en require_once no funciona

103

Tengo la siguiente estructura

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

El archivo include.php tiene lo siguiente

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

y en la página index.php que había incluido

require_once 'include/include.php';

Cuando abro la página index.php, aparece la siguiente advertencia y error fatal. No entiendo qué causa este error. Cuando di la ruta absoluta, funciona. Pero creo que el camino absoluto no es una buena idea.

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

Gracias por adelantado

usuario525146
fuente
Por lo general, estoy haciendo Objective-C y trato de poner mis manos en las secuencias de comandos php y es triste ver que ya he perdido 2 horas descubriendo cómo incluir archivos correctamente en PHP. Las cosas son tan fáciles con X-code.
rohan-patel
A menudo se encuentra con este error y, para solucionarlo rápidamente, siga estos pasos: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Respuestas:

216

Utilizar

__DIR__

para obtener la ruta actual del script y esto debería solucionar su problema.

Entonces:

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

Esto evitará los casos en los que puede ejecutar un script PHP desde una carpeta diferente y, por lo tanto, las rutas relacionadas no funcionarán.

Editar: problema de barra fijo solucionado

Raisen
fuente
42
¡Cuidado! __DIR__es nuevo en PHP 5.3. Si necesita que este script se ejecute en versiones anteriores de PHP, debería usarlo dirname(__FILE__)en su lugar.
Charles
27
Tenga en cuenta que debe incluir manualmente la barra diagonal al final __DIR__. Entonces: según require_once(__DIR__.'/../class/user.php'); la documentación , se omite la barra diagonal, excepto para el directorio raíz.
Ariel Allon
9
Gracias por la ayuda, pero todavía no entiendo por qué __DIR__es necesaria. Los documentos de PHP parecen decir que PHP buscará en el directorio del script actual de forma predeterminada. ¿Alguien puede arrojar algo de luz?
David
1
@David Creo que esto es necesario cuando importas un archivo desde 2 lugares al mismo tiempo. Por ejemplo, tiene un archivo con require "../a.php". Si este archivo se importa de otro archivo (x) en dir1/dir2/x.phpel archivo incluido será dir1/a.php, pero si x está en dir1/dir2/dir3/x.php, el archivo incluido será dir1/dir2/a.php, etc. ¿O me equivoco?
José Ramón
1
Ahora hay una lista de verificación de solución de problemas para este error frecuente aquí: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew
17

para php versión 5.2.17 __DIR__no funcionará, solo funcionará con php 5.3

Pero para la versión anterior de php dirname(__FILE__)perfectamente

Por ejemplo, escribe así

require_once dirname(__FILE__) . '/db_config.php';
Tecnología móvil.
fuente
1

En mi caso, no funciona, incluso con __DIR__o getcwd()sigue eligiendo la ruta incorrecta, lo resolví definiendo una costante en cada archivo que necesito con la ruta base absoluta del proyecto:

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

Tengo MAMP con php 5.4.10 y mi jerarquía de carpetas es basilar:

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

....

linuxatico
fuente
0

Me encontré con el mismo problema, en el que todo funcionaba bien, hasta el momento en que tenía una inclusión dentro de otra inclusión.

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

Solución 1. (codificación no deseada del nombre de mi carpeta html pública, pero funciona):

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

Solución 2 (comentario no deseado arriba sobre DIR que solo funciona desde php 5.3, pero funciona):

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

Solución 3 (no puedo ver ninguna desventaja y funciona perfectamente en mi php 5.3):

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