How do I include a file over 2 directories back?

后端 未结 19 1458
遥遥无期
遥遥无期 2020-12-22 17:51

How do you include a file that is more than 2 directories back. I know you can use ../index.php to include a file that is 2 directories back, but how do you do

相关标签:
19条回答
  • 2020-12-22 18:08

    including over directories can be processed by proxy file

    • root
    • .....|__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';
      
    0 讨论(0)
  • 2020-12-22 18:09

    I saw your answers and I used include path with syntax

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

    and http server (Apache 2.4.3) returned internal error 500.

    When I changed the path to

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

    everything is fine.

    0 讨论(0)
  • 2020-12-22 18:10

    Try ../../. You can modify it accordingly as it will take you up back two directories. First reach to root directory then access the required directory.

    E.g. You are in root/inc/usr/ap and there is another directory root/2nd/path. You can access the path directory from ap like this: ../../2nd/path first go to root than desired directory. If not working please share.

    0 讨论(0)
  • 2020-12-22 18:12
    ../../index.php 
    

           

    0 讨论(0)
  • 2020-12-22 18:13
    ../../../index.php
    

             

    0 讨论(0)
  • 2020-12-22 18:15
    include dirname(__FILE__).'/../../index.php';
    

    is your best bet here, and it will avoid most of the relative path bugs you can encounter with other solutions.

    Indeed, it will force the include to always be relative to the position of the current script where this code is placed (which location is most likely stable, since you define the architecture of your application). This is different from just doing include '../../index.php' which will include relatively to the executing (also named "calling") script and then relatively to the current working directory, which will point to the parent script that includes your script, instead of resolving from your included script's path.

    From the PHP documentation:

    Files are included based on the file path given or, if none is given, the include_path specified. If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing.

    And the oldest post I've found citing this trick dates back to 2003, by Tapken.

    You can test with the following setup:

    Create a layout like this:

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

    In parent.php, put:

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

    In sub/included.php, put:

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

    Result when accessing parent.php:

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

    As we can see, in the first case, the path is resolved from the calling script parent.php, while by using the dirname(__FILE__).'/path' trick, the include is done from the script included.php where the code is placed in.

    Beware, the following NOT equivalent to the trick above contrary to what can be read elsewhere:

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

    Indeed, prepending / will work, but it will resolve just like include ../../index.php from the calling script (the difference is that include_path won't be looked afterwards if it fails). From PHP doc:

    If a path is defined — whether absolute (starting with a drive letter or \ on Windows, or / on Unix/Linux systems) or relative to the current directory (starting with . or ..) — the include_path will be ignored altogether.

    0 讨论(0)
提交回复
热议问题