简体   繁体   中英

PHP include doesn't work

I'm not sure how simple is this to solve, but I assume I'm doing something wrong. I'm new to PHP, so bear with me, please.

When I started learning PHP, I always placed all my project files into the same folder along with index.php and thus included everything like this:

<?php
include('./translation.php');
?>

Later on in the process of learning as I gained experience and my skill increased, I had to start using folders and place my files into sub folders. I ended up successfully including my files with the following:

<?php
include('../translation.php');
?>

My trouble-free coding took an unexpected turn when I decided to start using sub-sub folders. After placing all the files even deeper into the file structure I was shocked to find out that I cannot include them anymore, using:

<?php
include('.../translation.php');
?>

Now I'm lost. What did I do wrong? Am I to understand that I cannot include files deeper than 2 directories in the project? Should I start using a different file system?

You got the concept incorrect.

  • . represents current directory
  • .. represents parent directory

These are the way a file system keeps in track of the file and browse depth.

But you cannot use ... to change the directory. As you go deeper, you have to use

For example:

include('../../translation.php');

includes the files, two level outside of current directory. Which is probably what you were trying to do.

The include should be:

<?php
include('../../translation.php');
?>

Each level 'up' needs its own ../ .

For example, if you had the following directories:

a
   a1
      filex.php
   a2
b
   b1
      filey.php

If in filex.php, you wanted to include filey.php, you would do the following:

<?php
include('../../b/b1/filey.php');
?>

Up/out twice, down/ib twice

Basically, any time you want to go 'down' a level / into a folder, you give the name of the folder followed by a forward slash. But to go 'up' or out of the current folder (to the parent folder of the current folder) you give .. followed by the forward slash

If you want to go deeper (subfolder of subfolder), just use ../../

include("../../translation.php");

However, if your project is middle size or big size, I'd rather suggest you to define absolute path. In your index.php or whatever your included file is, define something like SITE_ROOT or INCLUDES_ROOT .

define("SITE_ROOT", dirname(__FILE__));

and then just use it on demand.

include(SITE_ROOT."/../../translation.php");

which is pretty useful in case you are including files from different folders

That said, imagine you have this folder structure

  • ROOT
    • includes/
      • boot.php
    • translations
      • en.php
    • ajax/
      • ajax2/
        • ajaxfile.php
    • index.php

CASE1: (fails)

index.php includes

<?php
include("includes/boot.php");

ajax/ajax2/ajaxfile.php includes

<?php
include("../../includes/boot.php");

includes/boot.php includes

<?php 
include("translations/en.php"); // from index.php it works but from ajax/ajax2/ajaxfile.php it searches for wrong file

CASE2: (passes)

ajax/ajax2/ajaxfile.php and index.php has the same content as the CASE1

includes/boot.php includes

<?php
define("INCLUDES_ROOT", dirname(__FILE__));
include(INCLUDES_ROOT."/../translations/en.php");

which passes, because INCLUDES_ROOT makes sure that the whole include point to the correct directory!

Let's assume this tree of folders.

-> site
      -> public_html (Inside the site folder)
            ->  index.php (Inside the public_html folder)
      -> translation.php (Inside the site folder)

in your index.php you just have to use include "../translation.php";

if the translation.php is in the same folder as the site folder, you use include "../../translation.php";

if your translation.php is in the same folder as the index.php though, you just have to include like this: include "translation.php";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM