¿Cómo incluyo un archivo en 2 directorios hacia atrás?

6 minutos de lectura

¿Cómo se incluye un archivo que tiene más de 2 directorios atrás? Sé que puedes usar ../index.php para incluir un archivo que está 2 directorios atrás, pero ¿cómo lo haces para 3 directorios atrás? ¿Esto tiene sentido? Lo intenté .../index.php pero no funciona.

tengo un archivo en /game/forum/files/index.php y usa PHP include para incluir un archivo. que se encuentra en /includes/boot.inc.php; / siendo el directorio raíz.

  • chdir(”../”);

    – Mahesh Jamdade

    20 de marzo de 2019 a las 8:47

.. selecciona el directorio principal del actual. Por supuesto, esto se puede encadenar:

../../index.php

Esto sería dos directorios arriba.

  • @Brian Bueno, eso no tiene sentido, estás comparando manzanas y naranjas. Tienes razón en que un define se usaría aquí, pero (1) esa no era ni remotamente la pregunta aquí. Y (2) todavía usaría una ruta relativa en su define, a menos que realmente codifiques toda la ruta absoluta del servidor y me abstendría de eso ya que solo tiene desventajas. O (la tercera alternativa) podría usar la manipulación de cadenas para extraer el directorio principal de la ruta actual (expandida), pero una vez más, esto no tiene ningún ventajas de usar rutas relativas.

    – Konrad Rodolfo

    20 de agosto de 2012 a las 9:24


  • Lamentablemente, esto puede funcionar en un dispositivo y no en otro, /../ puede trabajar o ../ puede funcionar, o ninguno puede funcionar en tres computadoras diferentes con exactamente la misma configuración de entorno

    –Douglas Gaskell

    4 oct 2017 a las 17:23

  • @DouglasGaskell No, eso es incorrecto. La notación de ruta relativa, incluyendo ../ y ../../ (Nota: no ¡barra inicial!), funciona en todos los sistemas operativos modernos. Eso solía hacerlo no funciona en Windows y (largo hace) Macintosh, pero ahora funciona en todas partes, y lo ha hecho durante al menos los últimos diez años. Si no funciona en alguna parte, la razón es que la estructura del archivo es diferente y/o se encuentra en un directorio de trabajo diferente. Pero no está relacionado con este código.

    – Konrad Rodolfo

    04/10/2017 a las 17:31


  • Konrad, menciono esto porque acabo de tratar este problema no hace 10 minutos después de compartir un repositorio con un compañero de trabajo, usando una instantánea de VM. Por alguna razón todos los caminos tenían que tener /../ en vez de ../ sobre su entorno.

    –Douglas Gaskell

    4 oct 2017 a las 18:07

  • @DouglasGaskell Y puedo decirle con confianza que el error no está relacionado. De hecho, el camino /../ simplemente no tiene sentido en ningún sistema (es equivalente a /, o un error). ¿Estás seguro de que no estás pegado algo delante?

    – Konrad Rodolfo

    4 oct 2017 a las 18:59

avatar de usuario
dan hulton

Para incluir un archivo un directorio atrás, use '../file'. Para dos directorios atrás, use '../../file'. Y así.

Aunque, de manera realista, no debería realizar inclusiones relativas al directorio actual. ¿Qué sucede si desea mover ese archivo? Todos los enlaces se romperían. Una forma de asegurarse de que aún puede vincular a otros archivos, mientras conserva esos vínculos si mueve su archivo, es:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT es una variable de servidor que representa el directorio base en el que se encuentra su código.

  • Oye, Dan, pregunta rápida: dices “de manera realista, no debería realizar inclusiones relativas al directorio actual“. ¿Qué pasa con todas las rutas relativas que se encuentran en la mayoría de los documentos HTML? Si muevo mi archivo, ¿no se romperían también? ¿Existe un estándar de cuándo usar enlaces relativos o absolutos? ¡Gracias de antemano!

    – Govind Rai

    10 de noviembre de 2016 a las 1:21


  • creo que le falta una barra inclinada, debería ser: require_once($_SERVER)[‘DOCUMENT_ROOT’] . ‘/directorio/directorio/archivo’);

    – usuario889030

    6 de diciembre de 2017 a las 18:46

  • @ user889030 hasta donde yo sé, esa barra no es necesaria, al menos en la mayoría de los casos

    – BotMaster3000

    18 de enero de 2018 a las 12:36

  • @BotMaster3000 mmm: sandbox.onlinephpfunctions.com/code/…

    – usuario889030

    24 de enero de 2018 a las 4:54

. = current directory
.. = parent directory

Asi que ../ te atrapa un directorio atrás no dos.

Cadena ../ tantas veces como sea necesario para subir 2 o más niveles.

avatar de usuario
gaboroso

include dirname(__FILE__).'/../../index.php';

es su mejor apuesta aquí, y evitará la mayoría de los errores de ruta relativa que puede encontrar con otras soluciones.

De hecho, forzará que el include sea siempre relativo a la posición del script actual dónde se coloca este código (qué ubicación probablemente sea estable, ya que tú defines la arquitectura de tu aplicación). Esto es diferente de simplemente hacer include '../../index.php' que incluirá en relación con el script de ejecución (también llamado “llamada”) y luego en relación con el directorio de trabajo actualque apuntará a la secuencia de comandos principal que incluye su secuencia de comandos, en lugar de resolverse desde la ruta de la secuencia de comandos incluida.

De la documentación de PHP:

Los archivos se incluyen en función de la ruta del archivo proporcionada o, si no se proporciona ninguna, la ruta de inclusión especificada. Si el archivo no se encuentra en include_path, include finalmente buscará en el propio directorio del script de llamada y en el directorio de trabajo actual antes de fallar.

Y la publicación más antigua que he encontrado citando este truco se remonta a 2003, por Tapken.

Puedes probar con la siguiente configuración:

Crea un diseño como este:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

En parent.phpponer:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

En sub/included.phpponer:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Resultado al acceder parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Como vemos, en el primer caso, la ruta se resuelve desde el script de llamada parent.phpmientras que al usar el dirname(__FILE__).'/path' truco, el include se hace desde el script included.php donde se coloca el código.

Tenga cuidado, lo siguiente NO es equivalente al truco anterior, al contrario de lo que se puede leer en otros lugares:

include '/../../index.php';

De hecho, anteponiendo / funcionará, pero se resolverá como include ../../index.php del script de llamada (la diferencia es que include_path no será revisado después si falla). Desde el documento PHP:

Si se define una ruta, ya sea absoluta (comenzando con una letra de unidad o \ en Windows, o / en sistemas Unix/Linux) o relativa al directorio actual (comenzando con . o ..), include_path se ignorará por completo.

avatar de usuario
im_brian_d

../ es un directorio, repita para dos directorios ../../ o incluso tres: ../../../ y así.

La definición de constantes puede reducir la confusión porque profundizará en los directorios en lugar de retroceder.

Podrías definir algunas constantes así:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

Cuando uso ‘BD’ o mi ‘directorio base’ se ve así:

file(BD.'location/of/file.php');

definir(); referencia

avatar de usuario
dippas

../../index.php 

../../../includes/boot.inc.php

Cada instancia de ../ significa subir/retroceder un directorio.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad