Подтвердить что ты не робот

Как вы знаете правильный путь для использования в инструкции PHP require_once()

У многих из них есть файл config.php в корневом каталоге веб-приложения, которое я хочу включить почти в любой другой php файл. Поэтому у большинства из них есть строка, например:

require_once("config.php");

или иногда

require_once("../config.php");

или даже

require_once("../../config.php");

Но я никогда не ошибаюсь в первый раз. Я не могу понять, что php будет рассматривать как текущий рабочий каталог при чтении одного из этих файлов. Это, по-видимому, не каталог, в котором создается файл, содержащий вызов require_once(), потому что у меня есть два файла в том же каталоге, у которых есть разные пути для config.php.

Как у меня ситуация, когда один путь правильный для обновления страницы, но ajax может обновить часть страницы, требует другого пути к config.php в заявлении require_once():

Какой секрет? Откуда находится этот путь?

Стреляйте, я боялся, что это не будет обычной проблемой. Это происходит под apache 2.2.8 и PHP 5.2.6, запущенных в Windows.

4b9b3361

Ответ 1

Текущий рабочий каталог для PHP - это каталог, в котором находится названный файл script. Если ваши файлы выглядели следующим образом:

/A
   foo.php
   tar.php
   B/
       bar.php

Если вы вызываете foo.php(ex: http://example.com/foo.php), то рабочий каталог будет /A/. Если вы вызываете bar.php(ex: http://example.com/B/bar.php), рабочим каталогом будет /A/B/.

Там, где это становится сложно. Скажем, что foo.php таково:

<?php
require_once( 'B/bar.php' );
?>

И bar.php:

<?php
require_once( 'tar.php');
?>

Если мы вызываем foo.php, то bar.php успешно вызовет tar.php, поскольку tar.php и foo.php находятся в том же каталоге, который является рабочим каталогом. Если вместо этого вы вызовете bar.php, это не сработает.

Как правило, вы увидите либо во всех файлах:

require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );

или с конфигурационным файлом:

// config file
define( "APP_ROOT", realpath( dirname( __FILE__ ) ).'/' );

с остальными файлами, используя:

require_once( APP_ROOT.'../../path/to/file.php' );

Ответ 2

Мне нравится делать это:

require_once(dirname(__FILE__)."/../_include/header.inc");

Таким образом, ваши пути всегда будут относиться к текущему расположению файла.

Ответ 3

Я использую dirname(__FILE__) вещь, например bobwienholt, но то, что она может заплатить, - это базовая точка входа, которая загружает весь ваш другой код, определяющий константу, ссылающуюся на корень проекта, т.е.

define("ROOT",dirname(__FILE__).'/' ); 

а затем все, что вам нужно знать, - это путь, который находится по отношению к корню, то есть:

require(ROOT . "/lib/tool/error.php"); 

note,

вы должны ДЕЙСТВИТЕЛЬНО избегать путей с "../" в начале их, они не относятся к файлу, но по отношению к тому, где вы ARE, и это создает код неисправности.
 cd foo
 php bar/baz.php 
 -> some error saying it cant find the file
 cd bar 
 php baz.php 
 -> suddenly working.

Внимание!

Если вы используете нотацию "../", требуется complete игнорирование PHP Include Path, а ТОЛЬКО, где находится человек, который его запускает.

Ответ 4

Я включаю этот код вверху каждой страницы:

//get basic page variables
$self=$_SERVER['PHP_SELF']; 
$thispath=dirname($_SERVER['PHP_SELF']);
$sitebasepath=$_SERVER['DOCUMENT_ROOT'];

//include the global settings, variables and includes

include_once("$sitebasepath/globals/global.include.php");

Включить и потребовать, чтобы оба выполняли либо относительный путь, либо полный путь. Я предпочитаю работать с полным путем и делать все мои ссылки, как приведенное выше выражение inlcude. Это позволяет мне ввести общую переменную $sitebasepath, которая обрабатывает специфичную для учетной записи информацию, которая может измениться с машины на машину, а затем просто введите путь из webroot, т.е. /globals/whatever _file.php

Я также использую переменную $self в формах, которые могут называть себя обработкой ввода данных.

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

Ответ 5

Так как require и require_once очень похожи на include и include_once, вся документация отправляется в разделе "include" функций doc на php.net. который страница

Сначала отображаются файлы для включения в каждой строке include_path относительно текущего рабочего каталога, а затем в каталоге тока script. Например. если ваш include_path - это библиотеки, текущие Рабочий каталог -/www/, вы включая include/a.php, и есть включить "b.php" в этот файл, b.php сначала просматривается в /www/libraries/ а затем в /www/include/. Если имя файла начинается с./или../, это выглядит только в текущем рабочем каталоге.

Кроме того, вы можете найти все текущие пути include, выполнив "php -i" из командной строки. Вы можете отредактировать путь include в файле php.ini, а также через ini_set(). Вы также можете запустить функцию php_info() на своей странице, чтобы получить распечатку ваших env vars, если CLI неудобен.

Ответ 6

Если у вас есть достаточные права доступа, попробуйте изменить настройку PHP include_path для всего сайта. Если вы не можете этого сделать, вам придется либо маршрутизировать каждый запрос через тот же PHP скрипт (например, с помощью Apache mod_rewrite), либо вам придется использовать "инициализацию" script, которая устанавливает include_path:

$includeDir = realpath(dirname(__FILE__) . '/include'); 
ini_set('include_path', $includeDir . PATH_SEPARATOR . ini_get('include_path'));

После того, как этот файл включен, используйте пути относительно каталога include:

require_once '../init.php'; // The init-script
require_once 'MyFile.php'; // Includes /include/MyFile.php

Ответ 7

Единственное место, где я видел путь, который вы оценили, это файл, который вы сейчас редактируете. У меня никогда не было никаких проблем с этим, но если да, вы можете предоставить дополнительную информацию (версия PHP, ОС и т.д.).

Ответ 8

Путь файла PHP, запрошенный в исходном GET или POST, по существу является "рабочим каталогом" этого script. Любые "включенные" или "требуемые" сценарии наследуют это как их рабочий каталог.

Я либо использую абсолютные пути в require require, либо модифицирую PHP include_path, чтобы включить какой-либо путь в мое приложение, которое я могу использовать, чтобы сохранить дополнительную запись. Вы найдете это в php.ini.

include_path = ".:/list/of/paths/:/другой/путь/:/и/другой/один"

Я не знаю, поможет ли это вам в этом конкретном случае, но волшебные константы, такие как FILE и DIR, могут пригодиться, если вам когда-либо понадобится знать путь, в котором работает определенный файл.

http://us2.php.net/manual/en/language.constants.predefined.php