2008-10-02 15 views
60

¿Cómo se incluye un archivo de más de 2 directorios? Sé que puedes usar ../index.php para incluir un archivo que tenga 2 directorios atrás, pero ¿cómo lo haces para 3 directorios? ¿Tiene esto sentido? Intenté .../index.php pero no está funcionando.¿Cómo incluyo un archivo de más de 2 directorios?

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

+1

es más como PHP, HTML ... no – kender

Respuesta

11
../../index.php 

             

6

Usted puede hacer ../../directory/file.txt - Esto va en dos directorios espalda.

../../../ - esto va tres. etc

5
../../../includes/boot.inc.php 
111

.. selecciona el directorio principal de la corriente. Por supuesto, esto se puede encadenar:

../../index.php 

Esto sería dos directorios arriba.

+1

@ Brian Bueno, eso no tiene sentido, que está comparando manzanas y naranjas. Tiene 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 'definición', a menos que realmente codifique la ruta absoluta del servidor y me abstendría de hacerlo, ya que solo tiene desventajas. O (la tercera alternativa) podría usar la manipulación de cadenas para extraer el directorio padre de la ruta actual (expandida) pero una vez más esto no tiene * ninguna * ventaja al usar rutas relativas. –

+0

funcionó mucho apreciamos – humphrey

+0

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

6
../../../index.php 

                 

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

Cada instancia de ../ significa arriba/hacia atrás un directorio.

25
. = current directory 
.. = parent directory 

Así ../ le consigue un directorio de vuelta no dos.

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

5

Pero sea MUY teniendo cuidado al permitir que un usuario seleccione el archivo. Realmente no desea permitirles obtener un archivo llamado, por ejemplo,

../../../../../../../../../../etc/passwd 

u otros archivos del sistema confidenciales.

(Lo sentimos, ha pasado un tiempo desde que era un administrador de sistemas Linux, y yo pensar este es un archivo sensible, por lo que recuerdo)

46

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

Aunque, de manera realista, no debe realizar inclusiones en relación con el directorio actual. ¿Qué pasa si quieres mover ese archivo?Todos los enlaces se romperían. Una manera de asegurarse de que todavía se puede enlazar a otros archivos, al tiempo que conserva en los enlaces si se mueve el archivo, es:

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

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

+2

Pregunta rápida de Hey Dan: dices "*** Realísticamente no deberías estar realizando incluye relativo al directorio actual ***". ¿Qué pasa con todos los caminos relativos que están cubiertos en la mayoría de los documentos HTML? Si moviera mi archivo, ¿no se romperían también? ¿Existe un estándar de cuándo usar enlaces relativos versus absolutos? ¡Gracias de antemano! –

+0

Creo que falta una barra, debería ser: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ Directory/directory/file'); – user889030

+0

@ user889030 por lo que yo sé, no es necesario que la barra, al menos en la mayoría de los casos – BotMaster3000

2

si incluye el / al comienzo del include, el include se tomará como la ruta desde la raíz del sitio.

si su sitio es http://www.example.com/game/forum/files/index.php puede agregar un include a /includes/boot.inc.php que se resolvería en http://www.example.com/includes/boot.inc.php.

Debe tener cuidado con .. transversal ya que algunos servidores web lo tienen deshabilitado; también causa problemas cuando desea mover su sitio a una nueva máquina/host y la estructura es un poco diferente.

14

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

constantes que definen pueden reducir la confusión, ya que se perfore hacia adelante en directorios versos hacia atrás

se podría definir algunas constantes de este modo:

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

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

Cuando se utiliza 'BD' o 'directorio base' mi se ve de este modo:

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

define(); reference

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

es su mejor opción aquí, y evitará la mayoría de los errores de ruta relativos que puede encontrar con otras soluciones.

De hecho, forzará que el include sea siempre en relación con la posición del script actual donde se coloca este código (qué ubicación es más probable estable, ya que define la arquitectura de su aplicación). Esto es diferente de simplemente hacer include '../../index.php'which will include relatively to the executing (also named "calling") script and then relatively to the current working directory, que apuntará al script principal que incluye el script, en lugar de resolver desde la ruta del script incluido.

De la documentación de PHP:

archivos están incluidos en base a la ruta del archivo determinado o, si no se da ninguno, include_path especificado. Si el archivo no se encuentra en el include_path, include finalmente comprobará en el directorio del script de llamada y en el directorio de trabajo actual antes de fallar.

Y la publicación más antigua que encontré citando este truco dates back to 2003, by Tapken.

Puede probar con la siguiente configuración:

crear un diseño como este:

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

En parent.php, poner:

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

En sub/included.php, poner:

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

Resultado cuando se accede a parent.php:

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

Como podemos ver, en el primer caso, el camino se resuelve a partir de la secuencia de comandos que llama parent.php, mientras que utilizando el truco dirname(__FILE__).'/path', el include se hace desde el guión included.php donde el código se coloca en

Cuidado, el equivalente a no seguir el truco anterior al contrario de lo que se puede leer en otra parte:.

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

de hecho, pre pendiente / funcionará, pero se resolverá igual que include ../../index.php desde el script de llamada (la diferencia es que include_path no se examinará después si falla). From PHP doc:

Si se define un camino - 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 será ignorado por completo.

+0

- 1 primer método es completamente incorrecto. – diEcho

+0

@diEcho: ¿puedo saber por qué "está completamente mal"? Lo estoy usando en varias aplicaciones de grados profesionales y este método es el único que funcionó en todas las situaciones. También se detalla en el [manual php] (http://php.net/manual/en/function.include.php): no puede ser tan malo. – gaborous

+0

primera línea es completamente incorrecta. No puede agregar '..' en el medio de la ruta (relativo/absoluto). – diEcho

1

vi sus respuestas y yo solía ruta de inclusión con la sintaxis

require_once '../file.php'; // server internal error 500 

y el servidor HTTP (Apache 2.4.3) devuelto error interno 500.

Cuando cambié el camino a

require_once '/../file.php'; // OK 

todo está bien.

2

Probar ../../. Puede modificarlo en consecuencia, ya que lo llevará de vuelta a dos directorios. Primero, acceda al directorio raíz y luego acceda al directorio requerido.

E.g. Está en root/inc/usr/ap y hay otro directorio root/2nd/path. Puede acceder al directorio path desde ap de la siguiente manera: ../../2nd/path vaya primero a la raíz del directorio deseado. Si no funciona, comparte.

6

siguientes son maneras de acceder a los diferentes directorios: -

./ = Your current directory 
../ = One directory lower 
../../ = Two directories lower 
../../../ = Three directories lower 
2

incluyendo más de directorios puede ser procesado por archivo de proxy

  • raíz
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php: 
    $host='localhost'; 
    $user='username': 
    $pass='pass'; 
    
    proxy.php: 
    include_once 'db/dbsettings.php 
    
    requiredDbSettings.php: 
    include_once './../proxy.php'; 
    
2

si está utilizando php7 puede utilizar nombredir función con parámetro de nivel de 2, por ejemplo:

dirname("/usr/local/lib", 2); 

la el segundo parámetro "2" indica cuántos niveles suben

dirname referance

Cuestiones relacionadas