Включить файлы из родительского или другого каталога - PullRequest
37 голосов
/ 12 января 2012

Мне нужно включить файл из родительского каталога и других подкаталогов в подкаталог.Я делал это раньше, просто используя include ('/ rootdirectory / file.php');но теперь это не сработает.

Просто интересно, как я могу это сделать, спасибо.

Вот моя точная строка:

include('/forums/groups.php');

Это дает мне эту ошибку (страница все еще работает):

Предупреждение: include(/forums/groups.php) [function.include]: не удалось открыть поток: нет такого файла или каталога в C: \ xampp \ htdocs \ forums \ blog \ posts.php в строке

Предупреждение: include () [function.include]: Не удалось открыть файл /forums/groups.php для включения (include_path = '.; C: \ xampp \ php \ PEAR') в C: \ xampp \ htdocs \форумы \ блог \ posts.php в строке 3

Ответы [ 10 ]

75 голосов
/ 12 января 2012

include() и его родственники берут пути файловой системы, а не веб-пути относительно корня документа.Чтобы получить родительский каталог, используйте ../

include('../somefilein_parent.php');
include('../../somefile_2levels_up.php');

Если вы начинаете с /, будет использоваться абсолютный путь к системному файлу:

// Full absolute path...
include('/home/username/sites/project/include/config.php');
7 голосов
/ 21 января 2018

Если ваш сервер не разрешает файл в родительском каталоге, используя

include '../somefilein_parent.php'

, попробуйте это:

include __DIR__ . "/../somefilein_parent.php";

6 голосов
/ 12 января 2012

Вот что я написал с этой проблемой:

<?
function absolute_include($file)
         {
         /*
         $file is the file url relative to the root of your site.
         Yourdomain.com/folder/file.inc would be passed as
         "folder/file.inc"
         */

         $folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");

         if($folder_depth == false)
            $folder_depth = 1;

         include(str_repeat("../", $folder_depth - 1) . $file);
         }
?>

надеюсь, это поможет.

4 голосов
/ 12 января 2012

Зависит от того, где находится файл, из которого вы пытаетесь включить.

Пример:

/rootdir/pages/file.php

/someotherDir/index.php

ЕслиВы написали следующее в index.php: include('/rootdir/pages/file.php'); это будет ошибка, потому что она попытается получить:

/someotherDir/rootdir/pages/file.php Что, конечно, не существует ...

Так что вы быдолжен использовать include('../rootdir/pages/file.php');

3 голосов
/ 25 января 2015

С точки зрения непрофессионалов и практичности, я вижу это как старый трюк с DOS.Вау!Что это было?DOS?Никогда не слышал об этом!

".." возвращает вас из текущего подкаталога один раз в более высокую папку / каталог, и .. введите набранодважды поддерживает вас 2 родительские папки.Продолжайте добавлять " .. enter " вплотную, и вы скоро окажетесь на верхнем уровне каталога.

Что касается новичков, чтобы понять это лучше, подумайте об этом (с точки зрениядомашнего компьютера или «C: \ drive», если вы знаете, что это значит, а не «корневой каталог» веб-серверов / хоста).Пока вы это делаете, подумайте, что ваш веб-сайт существует где-то на жестком диске вашего домашнего компьютера и находится в какой-то папке на диске C: \.И, наконец, вы можете думать об этом как ".." назад один каталог, а "/" вперед один каталог / папка.

Сейчас!Если вы используете командную строку и находитесь в папке « myDocuments » вашего ПК, вы должны выйти из этой папки, чтобы приблизиться к более высокому каталогу «C: \», введя «».../».Если вы хотите получить доступ к файлу, который находится в каталоге вдов, пока вы все еще находитесь в папке myDocuments, вы теоретически наберете .. / windows ;в действительности в командной строке DOS вы просто набираете .. , но я настраиваю вас для Интернета. / естественным образом перенаправляет пересылку в другой каталог.

Использование « myDocuments » позволяет сделать вид, что вы создали в нем 2 папки с именами «PHP1» и «PHP2», втакие у нас теперь есть папки:

  • C: \ myDocuments \ PHP1
  • C: \ myDocuments \ PHP2

В PHP1 вы помещаете файл с именем index.php.и в папке PHP2 вы поместили файл с именем Found.php.теперь оно становится:

  • C: \ myDocuments \ PHP1 \ index.php
  • C: \ myDocuments \ PHP2 \ found.php

Внутри C: \ myDocuments \ PHP1 \ index.php вам нужно будет отредактировать и напечатать что-то вроде:

<?php include ('../php2/found.php')?>

The .. / является позиционным, поэтому он считает ваше текущее местоположение файла "C: \ myDocuments \ PHP1 \ index.php" и является директивой, сообщающей ему о выходе из каталога PHP1 и введите или перейдите в каталог PHP2 , чтобы найти файл Found.php .Но это читает это?Посмотрите мои мысли по устранению неисправностей ниже.

Сейчас!Предположим, у вас есть 1 папка PHP1 и подпапка PHP2:

  • C: \ myDocuments \ PHP1 \ PHP2

, на которую вы просто ссылаетесь /код

<?php include('/PHP2/found.php') ?>

, поскольку PHP2 существует в виде подкаталога, ниже или внутри каталога PHP1.

Если приведенное выше не работает, это может иметь отношение к access / htaccess или разрешениюкаталог или опечатка.Чтобы улучшить это ... попасть в устранение неполадок ... Если в файле "found.php" есть ошибки / опечатки, он будет зависать при рендеринге при ошибке, что может быть причиной (require / require_once) того, что выиспытывает иллюзию, что он не меняет каталоги и не обращается к файлу.В конце концов подумав, вам может потребоваться создать экземпляр ваших функций или ссылок, чтобы использовать включенное / требовать «что угодно», создав новую переменную или объект, такой как

$newObject = new nameobject("origianlThingy");

Помните, только потому, что вывключают / требуют что-то, иногда означает просто, что , оно включено / требуется для запуска, но может потребоваться пересоздание, чтобы сделать его активным или получить к нему доступ. Новый наверняка создаст его экземпляр «если он доступен для чтения» и сделает его доступным в текущем документе, сохранив оригинал.Однако вы должны ссылаться на вновь созданную переменную $ newObject во всех случаях .... если она глобальная.

Чтобы представить это в перспективе некоторой учетной записи веб-хостинга;веб-хост - это какой-то колоссальный жесткий диск (например, на вашем ПК), а ваш домен - не что иное, как папка, которую они вам назначили.Ваша папка называется корнем.Внутри этой папки вы можете делать все, что вам разрешено.ваш " один из многих способов " для перемещения между каталогами / папками состоит в том, чтобы использовать ../ сколько угодно раз, чтобы отступить от вашего текущего в отношении к позиции папки, которую вы хотите найти,

В своем пьяном состоянии я понимаю, что знаю слишком много, чтобы быть в здравом уме, и недостаточно, чтобы быть безумным! "

2 голосов
/ 12 января 2012

Любой путь, начинающийся с косой черты, будет абсолютным.Из корневой папки сервера, а не из корневой папки вашего корневого документа.Вы можете использовать ../ для перехода в родительский каталог.

1 голос
/ 23 февраля 2017

Я черпал вдохновение у Фрэнка и добавил что-то подобное в мой файл "settings.php", который затем включается во все страницы при наличии ссылки:

"settings.php"

    $folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");

     $slash="";

    for ($i=1;$i<=($folder_depth-2);++$i){

        $slash= $slash."../";

    }

в моем header.php для включения во все страницы:

a href = .... php echo $ slash.'index.php '....

Кажется, он работает как в локальной, так и в размещенной среде ....

(ПРИМЕЧАНИЕ: я абсолютный новичок)

0 голосов
/ 29 декабря 2018

Вас может заинтересовать использование встроенной функции php realpath (). и передавая константу DIR

например: $ TargetDirectory = realpath (__DIR __. "/../ .."); // Вернет вам 2 папки назад

String realpath () :: Возвращает канонизированный абсолютный путь ..

0 голосов
/ 27 декабря 2017

Был ли ранее такой же вопрос решен так:

включают в себя ( '/../ включает / config.php'); // примечание '/' появляющееся перед '../include/config.php'

0 голосов
/ 24 ноября 2016

корневой каталог (в PHP) - это каталог файла, который проверяется. Например, я перехожу на http://localhost/directory/to/file/index.php, корневой каталог будет "/ dictory / to / file", так как это тот, для которого вы сделали веб-запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...